{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# License_Plate_Detection_Pytorch\n",
    "\n",
    "This is a two stage lightweight and robust license plate recognition in MTCNN and LPRNet using Pytorch. MTCNN is a very well-known real-time detection model primarily designed for human face recognition. It is modified for license plate detection. LPRNet, another real-time end-to-end DNN, is utilized for the subsquent recognition. This network is attributed by its superior performance with low computational cost without preliminary character segmentation. The Spatial Transformer Layer is embeded in this work to allow a better characteristics for recognition. The recognition accuracy is up to 99% on CCPD base dataset with ~ 80 ms/image on Nivida Quadro P4000. Here is the illustration of the proposed pipeline:\n",
    "\n",
    "<img src=\"test/pipeline.png\"  width=\"600\" style=\"float: left;\">"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## MTCNN \n",
    "\n",
    "The modified MTCNN structure is presented as below. Only proposal net (Pnet) and output net (Onet) are used in this work since it is found that skipping Rnet will not hurt the accuracy in this case. The Onet accepts 24(height) x 94(width) BGR image which is consistent with input for LPRNet.\n",
    "\n",
    "<img src=\"test/MTCNN.png\"  width=\"600\" style=\"float: left;\">"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The MTCNN test code is shown as below: "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import sys\n",
    "sys.path.append('./LPRNet')\n",
    "sys.path.append('./MTCNN')\n",
    "from LPRNet_Test import *\n",
    "from MTCNN import *\n",
    "import numpy as np\n",
    "import argparse\n",
    "import torch\n",
    "import time\n",
    "import cv2\n",
    "device = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")\n",
    "\n",
    "image = cv2.imread('test/7.jpg')\n",
    "input = np.copy(image)\n",
    "bboxes = create_mtcnn_net(input, (50, 15), device, p_model_path='MTCNN/weights/pnet_Weights', o_model_path='MTCNN/weights/onet_Weights')\n",
    "\n",
    "for i in range(bboxes.shape[0]):\n",
    "\n",
    "    bbox = bboxes[i, :4]\n",
    "    x1, y1, x2, y2 = [int(bbox[j]) for j in range(4)]      \n",
    "    cv2.rectangle(input, (x1, y1), (x2, y2), (0, 0, 255), 10)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Visualize the Image"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAALgAAAD8CAYAAADE+m69AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzsvXmUJNd13vl7seSeGZm179VdvTcaQAPEQgLcQEKEAHCRKJGmRGlsSrYka99MavGcOfbIY5+Rx9poyeaRNUcyZY0omeRwKIoSSZAERABkE2gQQO9dS9delZWVe2RmbG/+iIzIzOqqRjdIQi0K3zl1qioz1hc33vvevd+9T0gpeRWv4jsVyt/3BbyKV/HtxKsG/iq+o/Gqgb+K72i8auCv4jsarxr4q/iOxqsG/iq+o/GKG7gQ4ruFEBeEEJeFEL/ySp//Vfzjgngl/eBCCBW4CHwXsAycAn5ASnn2FbuIV/GPCq90D34PcFlKOSeltID/B3jXK3wNr+IfEbRX+HzjwFLX/8vAvd0bCCF+DPgx/x9eo0SF/4UUKIr/PnqeQAj/cykdEBKkANTwOJ7nhX8H+ylCQY/oqKoGSITbJBaPoaoqVlMSjcZwPQ/peWi63zSu4xKNRkGAJ0ACAnCaFpFIBCkl9VaDZCqFpmpYjSaJeAzXdfFUBatlYVkWipT+zoCnhH+G0FQV6bjhF1LK8B4dPISiIABcD13TAbClh0Ti37lAUzVUVUVqCo7t+MdBIqVEUzXiiTi6plOpVIjFYpgNE+lJVFUlFoshkaiKSstq0Ww0QUAymcRxHBzHQSDa5xO4nhu2adBWnuvhSa/96DrbdENRFDzP869zB3uQ0r+W4L67n6OuR/BcNzzm2uLylpRy8KoT7GzXl9rgWwyxy2c9dyml/AjwEQA1rsjkvlj7C51EIgFSwayBaTYBj2QKEB5IhWrRJm3kADBNMzxmIpHAtm2OHTvG+Pg41WodIR0i9mkOHzyMYRisLPWBqjE6NMzF2cscOXIERUKzUmPfvn3+MXX/PRIS5r5xhpGhYRzPJTqQJduXI5sx2FheYP/0JOVSlYrbQFVVlq4sY66Ww+upRNvvYxeyGQMvX0a0W8O2bXTdN+RDd93Oc89/AyFBrbU4cuQIUkpWnBqFQgEhoU/qHDl0mK3tAq1UhHxhC4BcLsehQ4fY3NykWq36D0EI4vE4zWaTN73pTTSbTVZXV3Fdl42NDfL5PI7jcPLkSSzLolAokE6nicfjXLx4ESlleG2KohCPxwGo1+v+MwJKpRKRSCS8v1gsxqFDh5idncU0TQzDwLbtnjZIJpMYhkEul+PFF18EoL+/n3K5zPj4ONlslrW1NQB+/gc+cGUXW7oKr7SBLwOTXf9PAKt7bRz0vEgBXoKtDQvDSANu2JB2qxU2tqo3eww7QL1e5/Dhw/T39+O6/r5COkzlTjLQN0y5XEbtS1OvN5jf3kCk45xdnGNibJxcMsHi4iJCCIZHR8Jz3XLsOKVSiUQiwUCmD2lL4g5kJuMUvC1EGpLlJq1ag5RoQiLG5uYW4xNTKFGPlbXVnodcLpdJ79EOi2cukGjbgqMobG5uIgU0op1tVFVFVVWazSap4RxGLothGGiaxtDQEJcuXeLOO+9kY2MDwzCIx+NcuXIFx3HY3t5mcXGRYrGIqqoMDg5Sr9dxXZdUKsX8/DzFYhHLsgDfEAMjBdA0LWzXAJFIhEgkgmEY6LqO53lsbm723FcymSSdTlOtVjFNk+PHj7O2tkapVCKXy5FKpdje3iadTiOEQFX9ETp4Ua8Hr7SBnwIOCSH2AyvA+4Af3Gtjzw2ohwJSaffEEk3TcBx/CNb1aNhTCKmEBh5PJpCuR82sk4olGB4exrZtIpqOadbIZgysZgzb7KPV0qg4dQ4ePMjXv/51UkaGVCZNzawTU+NMT05SqVUREqK6f661tTUqlQq33HILuqqh6zqOZSM0n8oIQJFgpDOUixWkkCTTKaSUeEgGBgYArurFAmgRPRzams1m7+ft3j8Ri1Or1UgnU8iW5MKli9x77704RpyjR49SrVZ58umnuHz5MrfeeisbGxuMj49jGAaqqpLNZnEch7W1NUzTJBqN0qibVMsVAObm5gC/o4lFokTa1EgCw8PDaJqGpmmk02mWl5fD/wFGRka47bbbWFxcpNlshsZdr9fRdZ1yuUx/fz+Vin+ueDzOqVOnMAyDaDRKqVRCSkk2m0XXdVKpFPF4nNHR0fDFuh68ogYupXSEED8N/A0+Yf4jKeWZvfcQgIaQSheP8chm+9ja8odgIf3hECATS6B57Q6/bWRCwomTt4Xbql0/KAZbJYdixcZNwtLSEocPH2Z9fT08WzSVYGljjeHhYXC88Fy1Wo0jR46EvUoA1Y2gCA8hFZAWpVKNUrGGK5LYCtiqx/XAbd+DsouTy20b+Pz8PB/61V8hlUjy1S98mYXZOZ546klaGlx44QyVWpW63QppxqFDh5ieniaTybCyssIXv/hFHMehXC6HvW82lcZzXKQAp4tGZVNpioXt8PNSqYSmaeRyOS5cuEA0GkXTNLLZLACbm5vMz8+HBp5MJgGfcszMzOA4DtVqlXK5zE5omsa+ffswDAMhBLqus7m5ieu61Ot1Go3GdbUhvMJuwhuFGovI5OQgtXIJRfe5+E7uVitVIKqhepC0fMN1BVRp4bkOj3zvuymVSui6jpAwqCVC11H2wCT1ep16vU40HqPVajE1NcXy8nJnuPWk39ASoqaN57jkjCypTJp6vc6RI0eoVqvhhKneqIXXJqTf05cqZVopfzI7MTHB1nYh7JHy+TzFYhEhIW0RcvDc4Wle+9rXcv78eRzH4fHHH2diYoJGo4Gu6xw6dIh6w+Q1r3kNAKXtIk8//TRCgm7a5NIZ0FTS+0bp7+/n3nvvxbIsFhYWWF5eplQqsbS0RKPR4KFHHubwgYMsLlxh/tkXqZXKuALqkc6co7tta13USNf1cARNp9Nhj9yN4HvDMIhEIiwuLvK6170ORVFoNBpUq1WEECQSCSqVCgcOHCAWi/HCCy9QLpe5//77uXjxIuvr68zMzBCPx3nXa9/8jJTyrpeyoVeaotwQfKNRSBl9oSGXy2V0XWdgYIBKpYIS0UjEEwgJiuXTEwXwkNz9+jdgWRa6HiUWUWnVayRSGSqlKn39/hBrNht4SFqtFoqisLy8zJEjR5idnQX8CVm5WkFIGNYSZLNZxicmAJ9eLCwskM1m2dzcDB9uJpOhUqlQr9fbx1DRdR09GsFybFzXZWhoiOeee456tcZdd91FsbBNdXEt5La33347kViU207eztraGh/8lQ+xsLDAxYsXyefzDAwNcmJkBM/zqFar3HLyNr7y1JMICQldx/FccskMltkkvS/N6vIK/f39jA6PsHRlkWq1yh133MGDDz5IIb/F/OwciwtXqJbLtElh6JwSsuNPDj4H32DrDRMhBIZh0Gq1wmenaVroFYlEIjiOQzqdZmVlhZMnT4ZGvbq6SiqV8ime4/Ca17yG82fPkc/nw7Y8deoUw8PDjI2MMnd59oZs6KY28O7hX4o2rWijVCpRq1RQ25O+nRifnAb8Yd4DCuvL7BsdZGZmlIV5yGazrJdKxGIxDh8+zFNPPUUqlQLg8ccf55ZbbgHoGUIzmQxDA4NUq1XS6TRTU1MAPP/889i2HW7reR7lcrnHixBcs5SSdDrNQw89xNDQEJ/6y48jXM//6bq/T3ziE/z8L/4CAH19fTz55JOhAQ0MDPDMM89w+PBhIpEIQ0NDfOQP/gsPPPAAQoJXMbl47jzzS4sYI4Oc/uopshmDyclJnn/+eTY3N1GTMZ599lm++tWv8ub7Xs/S0hK62msOqgTFo+e6gJAGqtcY/LPZbGjgpmnSavlUKZPJMD8/j+u6ZDIZbr/9djKZDPV6nUKhwNLSEmtLy8Qi0XCusbW1RSQSYX1xmXQytfdJd8FNTVG0eFQOHN5HuVzuoSW6rofeDPBdgsEQbzVbPPi276KiS2KJOKBQbrRIlee5//go1ZigzzjB6mKLda9MvWGG3oZCoRBOYIQQpNPpkO8JCRSqHDl0mEwmE/rAy+VyOFEDv1e3bTukUqZpkskaNBIaMwcPsLy8zMEjh+nP5vjMp/+KYyNTRBSV+SsLaIqKZVmkjQyDR2cYHh3hwIEDDA4OcubMGUzT5Pnnn6dYLJLNZjlx4gRTU1OUy2UqlQrVapW+vj6mJiYxDAPpeijVJp/7689SqVWxLIuBgQHe9773seGYbJeKPHPq6yRaEstshCNVgG5X5l6fN1K9zwL8nt1xHOLxOFJKqtUqBw4coFgsUq/XuffeeymXy8zNzXHvvfdSLBZpOTbZdIbtrQKbF+aJ6xFcAaIvRbVeQ0gQJTMcSX7mp376uijKTS22Cpz8hmEgWg7g4QpoOTa1ij/ECUn4UyyVeOjh7/YnQIrf+1dKRVzLZv/+/WSSKVq2xZXFRVqugxQdH3mlUkHTtJBWaJpGo9HAsvxATSwWI5VKsbGx4ffUiqBUKbO0sszi4mJ4zalUKjwm+MdPxhOkUilqlSrpZIqlhSssLCzQ39/P2tqaH2RpdzS6roc+6njc95J85tN/xfDgEJVSGc9xieoRZvbt5/jRY0T1CGMjoyQSCe666y5OnjzJ8PAw1WqVSqXC+uYGlVo1pHRbW1v8zu/9Hp7jMjk+gee45Dc2fLq3Y/7b3bY7P0/G/fuKaDp2y8JuWQgJjbpJo27ieZ5PAU2TdDqNaZpsbW0RjUZ58cUXkVJipDNUyxXWV9fYWF7lyvwCayureG0PmQLkNzbZ2trCsWwimua3ZSzB9eKmpijdGJ2cYDm/igCiDjQrdRq2RzproLYfwpse+W42Clu8733v4yvPnqLeMNE8UDWFocFxipUV8rUmVqsKroLI9lKIwAPQPVoE/HpycpKG2CSi6X6PH4uynN8gkUlTzhfC7XO5XI8XJkC1UCQdT4D0PTDZbBYpIJUzcBR/8hb0g0LC+YsXcKVHKpXi0PR+HLPJhRfOEEvEGR0colGt8cxTX8W2bY4ePcrp06ep1WrccccdXL58nkajgWs7nPrKU6QTScamJvkX//In+dM//e9cnp/j937rt9F1neHh4TD+uzP4dD3QPEgbWYT0R1LN8z+rVKtMT08jhCAajZLL5Wg0Gniex+DgIJVKhcp2kbUrS8RiMVzpsVwuMzI03HN8VfrHU6X/LBp184au86Y2cOl51BomioRqy0aRPqeOO5CMZ5ACZMWktb3NT//cz7FcL9LIS/76775ErOUhmi0yQicRSZDfbOJ6GZxIEkVXAA1Jp8vSNC0MZDiOE9IM0zTJZrMUCgWirovQI9i2zXOzFyhLi6ppkYromHWTbMa4yotgmqbfKwP1VX/ipCd1zp07x8TEBCNDw2xtbWFFVaKOH+L2PI9sNus/eNshP7fEmfVTxGxJ0hE4hQpVKmi5HOPj45SX10nGE1iWhZHOUFpaZ2NtDUVRyIwM8vCjj3Bw5gB5q0pkMMvR3O2oX/8GqgRp+j1v4DXaLVC2E90BnQmjP/Rrq2jEIwlo2AjNl1P09fUxODhINBplYWGBwZHhduR4GaVuYSgRsDwikQjJZBbqLeKxePgs4i7Edf+YDV762nbipjZwhAj9wA3PRkFB9aBl20TbvK9Wq/EjP/qjKOBPYrIGSH+C6uDTm0bdxLJiSCFA1do9gLfjVCIMHuFJBgd9mYNj2bi2g+e4vkdG1dje3qbU9A05DLokEliOTcu1Q0FCYDi2baPqnRfIjoCmqEQ0nVtuPYGqqvzZn/4PqFm0Wi1c1yWbzZDP59GFSiqVw7UdUrEE9VqdyclJxsbGGBsb4/HHH2d0dJTbb70NLRbh9z/8n0laEjzJ4aNHePN9d1Eqlag3TOYW5jl7/hz/9If/F6x8iULbU2GaJvWGbzzX6hy7DTvA9lah53/RbvPpg5OkUikikQiryys+L7ds6qUKpxcWfepTrzM+OoaQkC9sceTIEZaXl3ueRXKXc94Ibm4D70J3wMNVOsGOO++5m4ZtMXf2DInRgZ5tnK7t4GouuRf6jSxa2/4DT0FAg4JAD7Hd9+0O0Ghd50vnsuHnjmWGw265XKavry8UGGWzWbLZLFXpEkFBV1RqNd+3LoXvaz59+jSbm5usrKzwwQ9+EICF4iaf/du/QbgeIJiZmUFVVf72059hcnqKzdU1Vrc2efDBBzl7/hybxUJozbbSaWPtOtvopbC9vsnTl7/CkUOHcaVHfm0dHJdqsYSK35aZbLbTntATMPpW4aY28J03GnBkU6/TsGwefcfbGR8fZ35+nsToQNibSgHblkkkGcFNRDD0CImYLwhqqg4t27rqXIHxZTMGw3EDtW1whtLm6S6U2z2wFL1iqG40NF8tmEsbRE079CW7iQgt18ZIpuHSNicPHubw8WM8e/ki99xzTxjoaNRNqtUq1XqNEydOsLa2huXaYe8vhODgwYP+dUjJ3Nwcn/vc5yhXKziOw/6BEUrbRW677TaWlpa4++gJvvKVrzA9Pc34+BiLi74PvG9qLIwuLi0thZ6ouO1PFIX05Q43imDEkiWbAwOjJD2FcrlKOhKBtpfINE0yhkEqkcRqh/8DahQ4FnYbLfZq82vhpjZwgSAZ9280kUh0hq1kkjvf9Bqm9+/j4sWLmI2r1WnJbAbPdlB1jWw6Q7+RpVit0Krkdz2X6vmaj0jfALVKhfHRMdLJFJtb+Y4/3pNhAEJEAL1DQ4LRwVRtFCmpmXWkBX3tl1JJxEnrGSbHJ1g/d5loNMqzXztF9sg0n/70pymXyxjJXHg9rUaThbl5APRoBD0a6G1gcHCQ/v5+UqkUf/EXfxF6W8AXIi0tLfHRj36URCLht5tl0zQbVDY30TSNarkS+uwNwyCRSpIvbJHNGGDboXFZlhX68i3LCj8Pqdw14Fh2SPNSiXgn6AWcOH4MgO1SESl8g44nYx2VYcshl/Pbolgshh6mw4cPMz8/f/NqUW4UAkKqYKsdeiAk7N+/n3Pnzl2lBQnQZ2RDvUqhUkIKKFbKe5JMVcLY0DBmpUpMj7OwsEAymcS27XAk0XU9HEUiOn4Ubxc3WrBN3Aa3/V05v0WxWGR8cBgjnWF6eponn3ySiZTPzScmJqBYD4+Ry+XC41SaZg/t2d7e9u+r4If8jx49ymcf+zzvevf3kl/fIJ1MoWkaGxsb/v6VCqlUCsdpcPDwIXQpQhmwYRgs5a/2+gT3EfSs+/btC0eRoF1fCsHzsuw6kYhG4JWenbsIgKcpxJKJtvPAw1ZtXMUlm82GRpzL5cJePXhJbgQ3t4F7ElnxG7gR8Q3p1ltv5e6772ZxcTEUx3f7nR3H6enNpYCmBkuVwlXH76Yl7laFmdwwy40V2qkFPfpm8IfR4eFh6vU6A0YGN+OysrJCJBnBsizf7ZdIhkZRsWwikYjPN6XGSDzDyvnLCCE4ffo0E1OTFItFHMehbjs9ctlYLEaz2WR9fZ2BI/vJF/Lk0gYJ19df5zc2iScTHDx4EMMweOv3vB0yccy8pNFq4tacMBrY19dHNBplLDeAgY4nVRKu4NKzzzM1NUV8OMt9992H57gsPPNCeA3lcjnUwtdqtbBNs13cubt9ukfQwAMFEIm1gE4YX1H87wuqTZOO9FWJgshIimvblEolhFQYHR8JPVque3UCxUvhpjZwKWXo97SFiqZpPPTwd3Pu3LlwOEskEuFwa9s2UkqGhobY3NzsMfyg59Z1PRzy1IhOPBL1+WY8ztLKMgBNqxXSnsC7AL5oqGeb9gOsmXVGR/1gy1w5z/vf+34++tGPMjMzQ19fH426iZMvgScRElzXZXFx0b+vTIxbbj2BWatTml1CVVWi0ShDI7778Ad/6P3UosLXpEt47ZETfObTf4UejbCR36RptRgYGmR1Y43G/ByryyscHZ5gfXUNKaBl+54lCayvrrG+6kdchYSDMweQAuYXF6nVan4gqi37NQzD15y3mpTL5R6JQrf6sNsnrUV0MoYRitP8nt6jbkGQ1yIIPE5WdwJWeJxSpUhaZGmYDQzDoFwuAmCaPgVLJGLYdudleSnc1JHM7je2sVXgFz74yzz1lSd7Zt7dfwNhFC/gpLsh8FQoba9IqVQKPTPX+imUS3t+p8WiLCwvoUV80ZCiKMxMTZNfWycdT3D06FGg8yAVRelKwfPCYTi4tkK5xHqxwBefeJx6ucLM1DQzU9N87m/+lo2NDdLpNPsPHURGNGzpUSuVuf2WE7z7ne/iDfe/PrzXdC5Lsi9LOpe9qg1mZmaYmZnh/vvvJx6Pc+uttzI52clHcQU4qsBTBNVqlaGhoauSDVzhe2GC3/lKiUK595m4ik8x3S5rC+in2v7ZE8IFYbd/d/1cJ27qHjyApml84Gd/mmee/hoioqEJJZzA7EwYUFWVcrlMKpW6KucP/B486HnDvE4BsYEsQ0NDrK6u0tfX1wl4dImoXvvQW3jmmWcAiAxm2Td2nEQiwcmTJ9nc3OSBkUdZ39xgeHiYtz34Xbzw+NO06iZz6wUuWjaqqpJMJikUCtx///0sr67w9n/6A2gRnReff4Er5QbS9fMVt1p1jt17J41qnf5IkkvPnfHdaHqEY8eO0TfQT8FrUdpeZ7Va5JE3vIXHPv95P2DSlgZIAVVNIiKCermKKvwkCVUo2LbN0tISmaxB3VHJ5/NsbeZJtTptlhodZHl9FSWu0zRbrK+v+/MN0Wm7yKCfYhbQwkA+sXlhDtFuW5FJIBSJ8CDe5cCKdz06J+2PCEIKdFtn6sg0iqJQby51qE4kcsMuxJtbbKVpUlVVfuInfoK8YnH58uWQlgTuokDcBP7QF1CXnWKsAME20Cv71CJ6OIkCmJqaCjNKTp06hW3bKIrC6OgoQggims7GxgYPPvggExMT5PN5tre3qZl1Ll++TCIWx90s0Z/ro1Kp0Gg0QrecHo0Qj8eZmpris6e+wnv+yXu5eP4CtaUNYu00r+TUCK973es4d+YsV54/R2mrQCbri8L6+/tRVZWC0o621upQqFIu+j2nlJJKpUI6naaZ1Imnkyge6I0Wzbp/78m4r8rLZA2K2ESTcdLxJFee83NNpYAiNumcQbVYDl2e0Os+rEZ8GjMxMUHOyLK6uupvV6lRLZXJZDJs65vhXCRldRJRuumNm4vhCQXFE2ScPuJaAikczNZauE1AbwDe+cgHvgP04ALe8d7vY35zlaJ9/Vkc14sgeKO2I5+B16JWqzE0NMTly5fZt28ft912Gz/+gR9nbtn3Oc/NzbFZLLO4cAW30WJ8fJzR0VHS6TSapjE6Osrayiqr8/P88Pt/iNOnT1OtVkONSst1cKwmp8++yL59+/jYxz7GWx94C+WVDQrlEg6S6rLLlz7/Bc6dOcvE0AiO4lOAcrlE39AgDpIrV674QqZanYwtQoEZwJEjR9jY2ODYocO8ePYMQoKRiOCqNsgOVxDSp8KVrW28RIt0Ot3TPkFAqttTFASzgmcU0sLtUmjIluKS7k+SMVII6fu+ux1YO/UkqqeEWvN0X5pmvdn2rPjfK7LjUbsR3NQGrugaFWxc4aKqKmNjY/7kpz3qdMtod/rB99JU1Bpm2JAxG9LxBK5ps930NctjY2OcPHmSK1eu0Gq1mJ2dpVarUawXWVxZptlsUixssz8zQG7GT22preW5tJbnjjvu4M0Pv4WNjQ2++IXH6L/1Vj75yU/S39/P4OAgruty5MgRGim/dMPFixfRIjoPP/wwm5ubHL7zNk6cOIHnuDz35SdZOT9LVo1SbJk89N7voVquYNt2mDnz+ulRLly4QDwaI1qzKBa2GR8fp9FoUC6XGR4eZvncJaazg5TLZZqROkQ9hBRYlRaO5aLrUYxUHB0HTAvRfkmE9DU/CRtsByLtkS+TNahGCEejVEQnGo2SSaVprW+jBMnRORcJlGWRhAP0zvUBvzcO/OytcPSUrNeX0WNRP/EiGlCXDr253oi0v+1NTFFSOUPe9bY3A/6wOz093fN9YOBhhv0eka7dGkRIGNI7AZpK1KcOhmHQaDS45557eO6559oZQb6YaKCvn2QyyfrqGhlXwW5ZfpJsPBb2zmtWjWg0SiIWJ25JYppOJmv4+62vYxgGw8cP8sY3v4lUKsX/8Rv/jpGREQYGBti/fz+1Wo2zL57B3iyyvVXgnnvuYd01uTw3Szqd5tCBgwwPD1Or1Th37hxra2tMjI0znekPI5CWc3U7SOFRSRbb9y5Imxka9aafYZ9M0Gg02nSnM1LWG2bIeZPJZFgeYlt1wqTperNOYTPvS2jtjqTCHWiF7byTlnSXjdgtYlmJ0hO5DbwySskfBbIZgze+/t3/8ClKNwL68HLQPcQGQ+NuAZog48Y0TWZnZ8MRIfB4mJUqUVVj38QkE+k+5ubmMAwDJRYh7VgoEqJqjjvuuIO1lVXmL1wKqcXslQVfHSjg+RdfYObgATY2NhjuH0BxPFRX8o1nnvXLMzRbpKTC8PAwjUYDJaEyMjLiJ/Jeuszy3AJDQ0Mc2j+D02wxmOsDt/f+rg3Z45FwVZt8NY8jHOJKx+BcAUaf722ybTv0xNiy46arlAq+lwMFV4Ggvww8I9eiJXtB8yCdySKAUrmM6vnHCR7Xjchlb/oe/L63vy2kJd0TyJeSdQZBnCBhdjd/aCADkMKfLO3WcGpE5/Wv84Mgi984x76JSdY21v3McylJGxm23Cae4qd31VY2ibWHXc9IUGv6MlohfFdbLpejb8AvZqMKhXjTC7c3TTO8r+5rc/v83rNSKpN2FJLtnrRWq3WVzOi97p3FdaTwqCRKIHxffLolwn3cXKLdXgqpRqZdxUChGvWrCAQZT0FKnxS+Z6tcLhOJdyVZB78lZIWO07J6Pt+JnZlZAWTX9Xd/L/Bdx1NTUxw79Pp/+D24EIJMJhNy7kBb0W3cAX0wDKMnlNudD6nQMRjTNHcNUvSct8tYvJbN1792yh9qbbh48WI41AY5klYEhK4S0aO4to1o106xHJtYLMbA0CC2bVNvmHhINtoZNNmMQdRVKZQ7GvKd8lAhoVGt02q12tLZFK5t+6XUJFTLvrcE0XszQZArkYhd5UUP4X2tAAAgAElEQVQSEmh1T9plu4v0AC80rv7+HJPTE2F7Bsdp1E2aZp2o7pfA64Zp+i+0U7d29ZZ0Yy/hVETXSQ4MtAM9nZxY2/LjC8nE9edl3tQGvpfOZC9005jrEe7v9AaE591BaXZ6EYJtLcticnKS2HAf+cIWq8srzOzb31PBKRKJsLS0RCqVCj0bhUKhU7Xreu4rlSYSi6IpKtm0wS1Hj/GZz3yG/rZmY2Njo6cWYw/CQAk7bkLzvSnC85OLXRBIBB3qUq2VSKR9XXCpXAjb1KqZnRFmx2lVrzcZ+eVkCe0NjawxQC47/NKbtnFTU5Tc0IC8/x0PhZWYAgRD+W4TlZ2GHZR7aNR7ezHwJzMBurn5Tkrj0SmX0D2hDVxqRi7LgQMHyOfz3Hv3PXz84x9HCqjHFNJGBsMwiMVioZ6jUCgwOTlJpVQmUm3RqJthWblAqddql6QzDAPL8feZmZnBMeJsbGy0r1OGNhsUtQSIRqNh7+iJLUzTlzs4ffH2PfqTTCE1EA5SrRCG0tsNkckabCs29R20UNBun9BsdtiPqqBIPxtrZ3vvRHDNwXPsjux2w69JKRDS4MhhX4nY1zfwD5+ieJ5HX19f+H+37iQYgvdyDQYPPsgVTLaH5peiJUENkGASupcmWtf1sKRac22dQt5X2K0sLTM8POyH5gcz2LbN+vo6uVyOfD5PqVRiYmKCWq2GqqqsrK0xmOvD8VwmxsdDBWAsFsOyLL8oUTTKWx94C1LAmlMn3i4jh9WhZEGFWOilZ5bbMbCqB03bQtnhB+8xUiHbbWtBFBLJOLZj4dgdyqHIDq/uNm8B4HpIrjbqwCvSPcrquk4ymQxrEAboppFBZQIjkyUV72sXXb1+3NQGfqMUpWffLoMNsNO4g/oe3YZ/re2vheDFGxwcZGlpic3NTUrSIhqPEY/GeL4d6BkYGCAz1E806iv93vv+H+DiufNsbGz4iRtdhtFtDKdPn/aVkemIX875GujW5yRSEYLqu6oLA+n2JLJs4xdX3jt60kPburwi3c3iKl0ZTNcIxOzlBSuVStelLw+O4bo3xjhuagPfiW4dcreacDdaErMh1TYWsUcSSNzp0A/YnYpcL4LAh2ma2LZNNpslqaXoGxggv7FBLJYiPjCCYRiUHJdjJ4+haRpPvXAaAL0vQ7zpkoz7o5TneT33pWl+Lmmj0aBer5PNGGRSKZqmP1nsnrD1XLvnhQaedBRirRjgIZIWoW9RJPakB7TbI+Z0aEkikaDZbJIxDIrCRuKFOpPA+Lsp005J7djYGOAnZwSVZ4O227l9UDFrYmKCqBb9zurBuwuh75xxBx6VborSTTNSbUpyLVpit6ye4Tz9MhNcd3sZQiltpaO+U4VCrVLFjPqeiGPHjrGx5vfqCoKMq3Dx/AWGB4dY39xgZGSkh5IBRKKCWCqB4oFSNolHYwjpy2J3EyX5iQY+LCdoK+Uqv+JOwxZAKpYI3Z8pFWzLz8CXHvTl+gGIRVWajoXSLhfhOo5fudexe7Q9wfXXayatpv95RO/MFWzHCq+5u9Oq13wNfl/fAPl1k0QixY2IYG9qA79RXA8t6UZ3xsoriamRMcqFbSpb2+hCwW40mZ+dYzSVDbNZkmm/OKcQgqWlpdBAAn2IkL2Bj2w2G76sQakLALNRJhibXMUNJ4HX8+A73hUfwTF1LYFtuW0PjM1A2g/KxG0obG2FbR5eQ1cbZ7MDGJlOal7g2s1mE1eVugu2Hx4ep1yq07nq6xelvGwDF0JMAn8CjLTP+BEp5e8IIfqAPwf2AQvAe6WUReF3x78DPAKYwD+TUj57vefr8Yd2lUaDjm/XyZfJBaXX9qBq3b3DXqHibxcCWuWV6yiu4MzTX/frGAIJhJ8YodvU6/UwOTcoYB/0dBFFIaXGfBoje48dQAjR+V/tjCBOHCzRRJGQcZTQcD3PCylKMFEFcJpuOA8SwfVnstgtHUUkMYwkw4lmWAumYZphCD8ajfZ4dVKpFEhBqxFFUzIA5PN5TNOXO2xvb/ScG8DIZIloWexmFE2JIqJ+pd/ukeGl8M304A7wS1LKZ4UQaeAZIcTngH8GfEFK+R/aywT+CvAh4GHgUPvnXuAP2LE+z/WiJ7olO7UJc9egJbsVtrneDO3AMOv1+jclGQiq4vZo0ukktnRfT1CRNYgihskfrkuxEHgcOj1Ztw4nHo92vut60xOJDuVISx3Htq/ZVj1ob5RIpLCUCBvrBSQ2etPsyVndbd9CoeAbpRRMTx3FsoL7iviBK9fFcuMkk3HK5TLZbJZ0Ms365iYXzi3zX//Lf+Ps2RdZWVlheXmZBx544KUbu42XbeBSyjVgrf13VQhxDn+RqXcBb25v9sfAl/AN/F3An0jf8f60ECIrhBhtH+dlIyhmHwjx4VsdXOjgmzHuYP9sNrtrDe1rIRKJ9JQmDiFcwqmxcEFcm5vupBxwI23VNhWpkc2mSaWSGEYaodVZWVm55p4zMzN+20lBImqQb5e6k1LyxBNPcPHiRdY2LvHCi9+gUqlgZHK8+YE3Eo8luefu+/ned7+dX/yln0LTIgwODGI7Nn/5lx+/kav+5iCE2AfcAXwVGA6MVkq5JoQYam+22wpr47Rfkq5jhausJdOpnh63O7izteWXOUhJHWzCykl71dMI8HIoSbfP/Ub37/bnBgXvg8+CRNrdPBfBJBp6lzDpgdKhH3oUoLNdeJ2ic72yO4MGO9SW7FyRLvhfURSfNkiB3YqDVMgZ46CW8BoNqvU6yVSCqakpPM+voxhkLFWrVc6dO8f58+d54YUX/BxUD/qzB7j77nuZmpri0KFDPPDAA7zjHe/AcSwazTqpZKYzWgmPan2N8+fPMn/lRYaGhshkb6z3+qYNXAiRAv4n8PNSyooQe17Abl9cxZS7V1nrHxkKvw+MK/gd8G7F6gRl9jK+Gy0WAy/vRbjR4++2Ps/LPe/17Bc8gEASHOxTKBTCv1utFslkMuTQhw8fBinIZfazvV0in89z4fwZHnvsMV588UXm5mdpNBrcd999AJw8eZL77ruP48eP8+ijj/KOR99JfivfHv0UcDP+7/YyBeAHgfzoq+/fVxSFSqVCIpGgUMgTiepkMpmwVsqN4JsycCGEjm/cfyqlDMaMjYB6CCFGgUCYcUMrrL2K64DsBHF6HmVXpBKxewb69PR0WHtkamqKM2f8pZJOnTrFxsYGTzzxBKlUyp9kSsH4yC088MBbue2223jjGx7kkUfeiWN71Ot1NE0nnU6xuHyJZDJJX64P27FZW1vDyGTJZgeuvq5rekJc0pkY5XKRaq0Sepay2QEc+8bSel62FqXtFfljYFtK+fNdn/8mUOiaZPZJKT8ohHgU+Gl8L8q9wO9KKe+51jni6ZRUBjNMTk5yzz33hKrB4LeQYDgK8ejuhQKbzeZVmT6xWKwnoLBbcAEIh+9uirSnoKkLO48T0CpFUXrSwV5uT90tkVUUSKX9tUMHBgYYGRkBfK+F67rYts3lhVPMzs6ysbHB1772Nba3t8Me++BBP3licHCQe+65h4mJCeLxOIcOHqLZalIsFqnVaqSSaVT66esLaj96RKM6oNBq+Vpw8DCtpZ5rDTQkeJnQuKPR+EveY8vxWevc3ByW3UJKSV+un77sPlJJ3wMjhHpdWpRvxsBfDzwBvEDndfw1fB7+MWAKWATeI6Xcbr8QHwa+G99N+AEp5devdY6+4UH51ve8K3xYL3zjeaSAxUuzfoQOODY5w9DAIJlUmr6BfoaGfMovpSQajTIxMUGr5TeS747aZmnJfxDJZDL0APT6arPhhHJjY6Mn4BSElbvTra7ltorH4yiKQjTaqceSTCbDsha5XC48fjqdDqN8yWQyXP4jWAsI4MyZM5w5cyZcoCmoRptOG9x6660YhsHIyAgnTpxgYmKC8ak40WiU8fFxFhYWerLSw7+FDNe0zG9u0Wg0yGR8Q/KrF/RSC9+4ffRMftWOnqSDvffdHR5Q5NL8pS7XsMfU5H6G+g8TBHmEEN9eA38l0Dc8KB/4vncAhKuSAfSlMjQaDd81qMXoy+bY3NzE87xQrLSwsMD29jbNZpO1tbXQd14sFsOXoF6vh+Ungt9Aezj0DTybzfZwv6DnvVbv341KpcLhw4dx3Ab5/AbgL+R69uxZAObn53vKWAR/p9NpDh8+zMjICK9//evD9YACw7Ntm42NNU6cOIGUgsGBMUqlEplMBkVRcByHZrOJ7RZRNUGzYaFH1E5gxejrGLjS6vi4bUnDbPlJJrjoWlv34iUIjKtbC9Nj4EqtQ5naNQeRyp777g4PyTaX5y+HBp7LGUxO7COiDvEdZeC5oQH5uke/C6NdLQl65ayB56QbgbEJIcKeNVDuAYyOjoY9aSwWC2fs0Wg0LKzZLVaq1+s9RYSC7bt7/Gg0Gj7obu9HMGGbnJxk34Es2axvnJZlEY/H/ZIK29u4rksymQx75EwmEy6fYhhGqHPpRiBh9SW1ORSZxTSvpmSZTCo0uiCgE6w9HwR3TGvFX9xJqkiZ6uHKnWDNS1MLv/fdTd3z0qH1zovikS9eDEdZvx5khqnJ/S/LwG/6UH23wQTolrN2Ryy7pa1SyrDX7q5G2p31s1eYvnv70dHRnu336q2Dl6k73BzUVclkUtheHisoOSag0TRpNP3j6Wi4nkNff66zXHaqvyc41e1uDK5P17X2j4quxIi1167pVmFaVqDUCzwWHVdioFNJxNO40m3nxwXfBl6OGyl+ttOYb2RfDykllmWxvb3dI6aDvdPeXgo3vYG/FNS2Ptn7NgV3rhe76y4CbUmaRDrZMfAu7EzW2O0430p0T3TDXlO2K79et5fj2wDhEomozM7NXVWO75vBTW3ge/nUPQhXCYg5fujZU7o6nzYCXUQ3rpc77yYf3bn9bvt3f+Y4ju9HxqNhraHpfs/aHbjpTl3r3nfn3909ePe+3TUOA7w0z925XffE7++pXKVSZbtUpWVvo+t6z30Glbz8xXq169aPw01u4EjJYL9vpNaOmieugFKlTJ/UyWb8Sqi1LrpiOfZVmeU+PBKJWPj3TvjbX09xx4Bv7v2i1Gpm+9z+knpBEjVChi+vaZohLXFdN6QfQaVcgEQ8GT7UTLozbHfokEJUi/LyjfPvuwarR0SLsLK6TK3uR2c7L7VHIpHCdhyk8FBUnY/+8X+/7iPf5AbeyRIJ6x6JTpVSKcGW/lo8QQm2l6Qr3fqNHnhd318HdupAdh4HhfHx8Y5+RYkgFN9VWSxt9hyqe/nCbgMP9BuaGqNcroLwSMRTRNovuuUEFOPv20C/edTMvaoBd014FZcnnn6ST33mb6/7uDe1gXuOQ7w9GjW6jFbJdMp5Nes2Dc1vhoTdEelvOObu4fAu/cZOumKaJigRwF8hGbhq+A8lnaHP1wV6SworioJh5Dhy8EjnXLEBTNOkVHBIpBO+qKgdAAqqNzWbTVqtVvi54pdxpVyyScTbMlS9Qz+iWoob8VTcbOj2nJTL5TBjq/tF72hqJBvWCj/zrz/E//qrv8unP/Hn13WOm9rAkVDIb/kusZQeKle6vQpaRKfeMMP1ZUzTxFOASLc4qzO5SyTjPSfo/O+2XTJe2FPu7UXolaJ2UxTLahKN+mlhmq6QiHeirCGPdmrhA+xOqgZCn3uwOCpSkIgHgRJ2uZ5/eIbdgUc0GmV7e5v1jd1FpUIKhCNoOi1+8ud+kg/86I+QbscCrgf/YFonqHIa/O6RydKmLuLqpQOBrtogV4ubOuhuiq6i6zeIbLYvrJdCV42Rl1O8/TsewqVY2qRU3n1hMICWquFGE/zr3/gPjI/tI5PJkDGuxyfv46buwbtXeLAKZdKG0QkhlP0qsbQL0JTL5XDpjW6Uy2X0WLVrgrp34yQSCWzHIpHS8WlHd5jZ/96nLB6esHZNGzJNk3g8zuTUBOVSpXeBzzZ0Vb9qn+D4u8H3dvjX0Gq1rttLcjOiN7RfxZVVSpUV1tbWwhE3hBQomUH+28c/xdPnZnnno29nYmKM5fUXr/t8N3UPLoSg3uiswru9teWvItDVe/dknrfpSve6OuD5xt2OCnVvb7Vsv+vfofo3G/WQrnTLc6F3uZG90Gg0/DB4dzRqt8hUcL72ct+96JyjZTVotVq0Wo2b0Lg9uj1KAST+7OTq+kBK+COEYDO/wWZ+bVe/vxTg2B5/8n//CW+47w0MjoxyaW6WA4cOXffV3dQ9uKSzBo4nOmvBfKuQzQ5g1ptt3cS16MvfB3ZSpptVUtHtlepcs9O2aA/QEWEoUiWoiehRLJfbayRV9ox5fOYznyEajXLixAniQuMNb3wrWeP6M6tuagN3pMeWbWLbfu+mqioRxcNrr08Z+Lh3FpcEv1es1WoYRhrbq6AHYelEgq2tLYxMlprtoYgUCAfUcs+5TdMEKdCVjvJPUZRdaUR30i74E8RGo9E5DnvTj2DCHORUXrW9kKAE8gIF6AiXXknsmjIHoJb8eYVUe+hctStBPtns9O4O7eUIhUfLapLP58OEh2AkSyQSaJrG2bNn+eQn/18OHDjIhQsX+NA//xnS6SQ3Eri/qQ1cInGlhyv9Ijhh5M5VieoRysUSqq71DNvdxu4ntEoiCTVUIpbLRXQ96ivVXEF//yBIQaPVrTPpeE/8hWA75RgC2W3F3H1R0uAYpVIJXddDQw+CNoZh9ORk7lVXMdC8A5iNql8PRHptQ+tIT7sN79tBX3Y7fvdnmqbQsppoqkIkGmV1dZ1EIsVGuYoejWA1W2RdweyFS7hCcsV1cFyBkY5zINmgWNgCFMrNckjTTNNkdHSY5549TWm7iH5E5/zFy9TTEf7nl/6a+cuXrvv6b2oDB79ccSaTCXs5s1anGUkQa5co1jQt1FB3wxOgqf4cr5Cv0Ug6IBX0SBSkHgZHCoUC4JFIdX3eLfVEaW8DiaROYbuI49bRd8+x6EF3KlhwDMdxXkYKXXeGjh3+L5FdniGva9sbT9HbDTYSS+3MkyvtNSu7X8qnvvoMqiq4dGmWseGDRKNxRkZGaEYF81fmWF1d9Vd8tmwUXeMKCa4sLlMpF1n66if4Fz/8w+iuf7YAjtCZXdnkr77wZW69941sbW3x0Nvexn/9yz/hy48/flV5iWvhpjfw/fv3Mzs7y+zsLJOTk2iaxvr6epjGpHgKpZWFcGXdoCJrNBqlaflUJuHGfE2yVLCbYLc8kBCL+VkxoGDWPLbyWxiZnK/GE/42imKGIWOPbRIpBdstYZtyV9pRq9XIZDKUy+Xe+iRtBGXZgn2LxWLo++6evAZDNnTpT3roClgOPbbfcurs9PxcD3ZOmgPpQAGLza08+Y1NZufnOH78uJ/4q7i4rkuhUGC1YmFZFpumx4VnT2EYBouf/f/IZA1Onz4dLjC7vb3tF/3XNfbv38+H/+D3+f1YiUJTIdf0EPFOSYS6Guexz34JkewHFHRdZ//+/Vz8m79mX9TYJZN3b9zUBu66Lr/8y7/MRz7yEZ4+9TWGh4f5oR98Px//5Cf4u8ef4NCRw0gpyWQyeEg2NzfRNA2jWsFFkssYZDMGmiWpVTta6UajdVXiLQjisTSW5SC6fNWJhNYxUq13pbfduD/4o4ppmtiOgx5R21WoOgYXT0RZWlkMKzxFumqkBD1xs9mkr7+/XXCnhq6rftHMl6KfUqDICIbhH7tWq4Xpd8ViMTTeeDzO2toa9XqdfD6PlJKDBw+iKAr9/f3Ekwm8egvHcyGqkcqkmV1c4AtffIxyuUy9XufKlSs0mz6P3traQtM0KpUKw4MjzBw8wD13vYYXzryI4ziYqw1y/X3Yts3Zs2c5uH+GO+6+B+fKJoqnINseLk2PsLhd5srSMsduOYGmabzpTW/CdV00xR+Zshlj93vfBTe1gQMcOXSYffv2cW5hlq99/gvcd+fd/NEf/REPP/wwlmXx/d//br7v+97DO9/5dtaXV9h/6DCO4yClS359g0wmQ9yGmB4hk/HLGSeTSZqe47sAW1cvT9itQrR6lrGLXp2xEkC2aYFUwIuCFyXqNdFd0S6u09m+tlkhCkQ9B7w4Uccv1GN1vUARz6OW97OTnISOpXooeOAFMoKdrsr2Z0JhYXaOzU0/7L21tcXMzAzgZy0FcxFNSC4uzLG+vo6UEiklc8uL4fpEZ86f4+L6EqVSiVa1xuTkFAqCaDxGIpMmlUmTSPiSg1qtxtTUFIrl8pWzF1EVnaX8Or/1e7/F8ePH+ehHP0p/fz+pVIqt1XV0F3QX3njba3h8/q9xld7xZmNjA9M0mZ6e5lOf+hRvectbmJubY2l7E6lC6was9qY2cEVR+NznPsfE9BQDB6dZevECb3/dm/yCk0K08xEl+6dmUBSNoyduZWhoiH/zv/1bbrvlNm698wTFYpFquYJ0PdLpNDMHD+DVS7C5QqVSYXx8HPB73WDylCtvhTmKorpNJBIhmzGINdqVJ2UnKTmA2Zaj2LbNQF8fjhUhq6QwK7WrBGA67QpQpkKr4dFwHMCjrNWJxdrr+7Q86uUKqazButNia+EKSIVKscPnXdfljjvu4Pbbb8d1XeJanFK9RE2FvNWgWi2zVdjiy8+dAvy4QpC1ND8/T7Hoc+py2V+wVdM04vE4mqZx/PhxVmvFsDxHn4jy5ONPUKxWUPsM/v1v/nsSiQQf+9jHeO1rX4trO2ydmyNmSaRwGBoc4o0PvJnf+Df/luPHj6PrOvOzc6TRGZnYR58WZ9SNhhV+m6ZJLpejXq9z6dIlotEo58+f561vfSuu61Kr1ciODpHP58kMXy2D3gs3tYFrmsZzz3+DH//Jf8lXLr3I8Ogoly9f5s6HHiSZTHPlyhV++Rf/FUjByMgIqqryz3/kR7ntlpOUqtuMjY2xsrLC0NAAn/vClxAS/tNv/xZ/8Rd/TrlcplEokM/n0eJRGrU6d955JwDFcolqtYphGFSrVWKxGNlMjoloCrtlkckaPPfc84wM+UtpDI4OMzY25gegVJWhIb9Msohl2VpbRUiFer0aGle1WqVQ8FOyIgmP/oEBfxVfmWZ4cAgpFFo49A8foSnBtQX7JvyVDdyxKmfPn6NcLmPV63z+y1/msS99meXlZRYXrrBdKoZ1DQGWL18GVSGVydC0HcbGxpicnGRru0A6nSYajfKWt7yZ//3f/QbgVyj4P//jb7KyskLDajEzvY+lK4v8qw/9Ep7nkUmlqLg2d955J7/7u79LvV6n2WyyurzCb/z6r2G7fircB3/11/nqqa9RLBa5ePEiR48eJZlM0ipvkR0eoVatsrxwpU27/E5DVVW2t7dZW1tjev8Mtu1y9OjRUJh2Ihrn/T/zQcDjP/7oL1yfDX2rjPHbAUX4lZUO7TvEcK4fx3NpSRe3K3KmeR66ItE8aLZ9r1HpIaQvlG+1Wqwur5BNZAGPX//VX+Oxxz6Prmr84cf+koMzB9gqFFlaX+anf/Zn/CKezRaOZZPJGqxv5dEi/sR1u3+YkZExvIhKw7VZ3vIpxOz6MpHnvwH4UcyHHvKXXTET42xu5cMYTWDgHhKz4foLTBXmqZ17HoCkOYhZreEJOLOyEPLl0lYBs+nTl1iq6i8EWyqTiERJJ/016e974xsoVcokM2mc7WKoFX/uuRfQFZ1MLkssneBLT3yZD37wg/T391MoFKhVqnz4//owKgKB4GtnniWVSvHkk0+yb3KK/v5+pieneM/3vwerPcL9p9/+LZ58+im2traYnvbXlD948CDf867vYWF+no997GNomsbjn3+cX/jQL/D888+HS3xnNY0//MM/JJVKcXn2HIgGoICnU69ZnPraN9A0jXQ6HToL3vd9/wTX8xiQEWzrxgJyN7WBO66D67ooCI6OTPLs+Bh9h6apNap4AsZGRsmoUaTrErNhWTX58he/xA+99VFS8RSe8P3PLc9BALOL84yNjLNdLpFJxFm7OE9rs8gjj76d3ECOZCZNRKgcHZ7kz//sz2haFk48xi133IKUkr974Vl++M7bSGRy3Hp4P7/3nz9MOmuwvrSCrmqkcwatRpPFss9/a7UaxXIJIRXi8WgYMHI8l6ju1/B2N0scP3qMeDLBqeWnEKri92rbZR59+BEeefujHH3dXfzsL/48lUqFCxcuhBVn5555gZUri0xMT7Pp1Pnclx7jp37sJxgdH6PRaHDLsePM9I9Q2S4ynsry2ne8jVQmTSqVolqtcvToUd724HcRDfUtgs9//vP86Z/9D7a2tvj/uTvvMLnK8u9/zpzpdads302yJW1JJ5USIQGUgIiIEpAiRBGkqFho0kQE/ImggvQmnRClBQwxAgkJIT0hdbO72Zat03s95/3jzJzdTTYkEd/fG9/vdc21szNnzsw55z7Pcz93+X4tFguNjY1cc/WPSKVTGPR6XnjpRTwlxaxatYoRI0YQi8VobGzkpl/eSCarrG/8fj+SVuLS71/Kli1b8Hg8qqtTai6ioqKCZDJJLNEHGiUUJEo24hGJ7v0hKsfU0t3dzdy5c6mvH0OOHGgggERrVxv3/8/vjtiGjmkDl2WZlStX0ti0G5fNwfaNG9m4eZOiwCto0Gq1ZNNpMqkCeXqKf/5rBZ3tHWSLB1baqXiCve2N1IyoBxQOPZvZymeffsqDD/yBbCpFPJlQOritdnZu346UzaETRdIo3IGiqKOqspL/uf/3QBYREys/WUVPTw9WpwODVscZZ5yBXq9XyHPq6pk0YTJ6o4Edu7azfv16Xn31VbQakZKohou/dSHVI0ZgLXaRTKdIZdKse+Aeiix29FodF37rO5iNJs4++2x60zGu+MH3ufvOu9CbjHS3tVFaWUVWrVqUOfe8b2K32/GUFBOLRfD5/Pzh9w/S2aUov639bC2LFi3iV7ffRnl5OdWVVXy09F3efPVvyOkMnZ1dvPjii6Q0GVwuFzU1Nej1eoxGPddd8xNyiSRN+/ZiMhh59IE/cOONN+pqQcMAACAASURBVLJlyxY6OjrI5XJcfskV5BIpHnjgAXbv3s21d9/KJZdcooZvU6kUSDLBdDC/tlqGJOfV32SJeCzJnj17UXufczkmTJjA6LrRdHTsZ82aNXz48b+Oulf1mDZwUPhN7rnnHp588mmemPMkr732GpMmTVLfv+qqq3j4oT8p6Q1JCd1V1dWwL+JXExSeEZXUjajDImmIaJQaZIPBwMsvv8yDD/xB3VcqlSKlS6ncKgo0ak/g5yvXoM8pWU5BlNDmVQ2cdgdjR9Zy2swTSUpZLrzgu8jIiAiE41Eee/jPaM1G3G43Wo1Iuq2ZWeMnEYnHmHrCLG666SY2bd2CxemgsrSC9p2NVLpLCMQiyFotV1y6iD5vP1qtkrWdPm0G5591DoKsZEzXrvuMH/zgB9x5551MmjSJpp278Yyqw2Iwkg7HMRgM3H///fQJKSRJwmKxkI0nGT26AY0skxOgpKqCeWd9jSt+cg2xWIxcLkculmT7ho3oJIk+v4833n+Hhx56iGcXv8I1111LfX090WiUyZMn0+vrw5DJ0djawtU3/JjLL798yHVMJpM0jBvP3T/5JVqtlra2tgHeaCCRy7CvZz8mlzIwybLM008/TU9PD21tbYwZM4ZwOHzUBn5MVxMCNDQ0MGvWLLRaLdOmTcNgMDBnzhy+/vWvI0kSq1atwmAwMHPmTHTxDP1d+yk0P8XjcRA1+HNJckiI6RSNexvJ5XJEIpEhCQ6fz0dNTQ3FxcUquQ6ABgEpL1Q1tmY0poyiZGBDgykto01kMdttEIpj9SZI9QXQpdPo0xnEdJISkwWLJLJty1YlwuLxYK6rYENnE6ZRZWxva2baqScRyCWR7Cai4Qhz6o6jKCtic9jZ0tnEjFkz6evrI5FIoDeb2PzRamo1Np547HGcTie//vWvWbx4MRaLhebmZirtbuyCjvD+bux2O4888gjf+Oa5tLW1UVRUhFFvINzRw0mTjseKBm88xi/vuZMrb7ieZ555hoqKCrQakYw3xIXnfpv9e/bSFQmwtXkPt//ut9x+++2IokhfXx9+v5+5c+ditVu48/f3UTG+niXLlg4hSw2FQgQCATQaDSeffDJbt24dco4B/Lkk+0M+tEVWUqkUmUyGcDhMIpGgrKyMcDis9qwWSJCOBMe0gQuCQCaToa2jnb3NjdSMrMVsNrN3714uuugiwuEwer0evdHA6aefjlEUMdjt7GlrQifq1YVKKhajbV8LmUyG8vJyDAYDJSUlKueJLEAynqKzs5NoNDqk1iIn5ygtLcVoNCKIGt5+9x1iCUUvMuDzYzGZCEUjJKMxOlvbCAdDaBDY19yCKGjZ+Nl6jp86FX8wgN/vpaurSynO0oo0NDRw21138NIrL2O32wn0e+nt7SWRSpJKJpkxYwZXXXUVnd1diKJIbW0tFouFSQ3Hodfp6OjoYPHixdx266/44O9vkk6n8bjcdLS1MbquniWL38But9PZ2ckjf36YZcuWUVVVRTAYpHrkCKUcVcrR3t1BIpXkvPO/xQMPPEBnZ6eSQCtyMGXaVDRakdf/9gaNTXvZsWsnnV37kSSJSCSC263wt/zlL3+hpXUf06Yfz8erVg4hK5JlmaqRIzjjjDMIh8Ns2rQJX7/S8ieKIoKoIRgMIiGTySmMXGazWeVGTCaTGAwGSktLKSsrU2P5R4Jj2sANBgOdnZ28++67PP/887jdbtxuNy+9+CJr166luLgYV3kpryxZzJTpMwCl2u83v/kNok6jajpOmT6dpUuXKuE+q0N1UfyJKGkRMholQ5hOp5UM4gFtZJFIhGg0Sjab5d133z2oFkIvDnh6pdWVbNz5OV3ePvqCfu649zf8a/UqKitGcdaZ55NM5JgxYwYWiwW73U59fT1dXYoB5zJZzFo90ydMJplMMmLECE488UReePRRJk6cyJ49e2hvb8ftduPxeDjn/PN48713ueqn19Pe309DQwPhcJhTTjkFi8VCWVkZS5cvIylIfO/qK1mwYIGSOo9G8Xq9OJ1O4vE4H3zwAZ988gnJZFItT21ubiaVSlFSUsLSpUvp7u7mmmuu4dH77x8yABQVFWE0Glm6dCm7du1i8eLFB6X+jRot40bW8uMrr8FmN4KQQtYMrU5sbm4e1gYK19ztVkSvfD6fmgc4EhzTBq4VlYSD3W5HEATmz5/P6NGjqaquZvXaT3nwjw/RFw9z54O/QzIbMFnMmEwmNm3ZiESOhoYJ9Pm8dHd3s3r1akCpKAmHw7S2t+GNBHjvk48JpFNotCIjq6oRBIFdO3fy9ttvqzXKfX19xGIxysrK0Gq1iKJIJpNRDbS6ulrxa3M5Rk4YSzCbpDXQh7W4lLppE6kaN4ZvffNSbJZyTp9/rjLSejxcf/31yLLM1VdfjUajYXLdWGpcpUyqH0tbWxvnnnsu+/fv5y9//Sv79u1jwoQJeJwuSkpKaGxsRHTZqJ06gQXfOY8f/PBKPv/8c+LxOCtWrKC4uJjzzjuP7R0trNm2ibCk0MB5vV6CwSDpdJpJkyZx77330tvby2OPPcaSJUsYNWqUugaRJAmj0ciHH37IunXreP7556mbOlWluevv71cjMmazmQULFrBlyxY1WhSPx0nE4lgkkbFl1WjTGd5771XiyX50BiUEajQa2b59Oz09PVRVVSEIgtpgYjab0el05HI5/H4//f39w/LAfBG+tIELgiAKgrBZEIR38//XCILwmSAIewVBeE0QBH3+dUP+/6b8+6MOt+90Jk1FRYVKhimIittSVVXFvqZmJk2YSCKVpLFxDx09HdTW1ip6L+k077zzDlde9UNsZgv9/f18/PHHKrdIMqZIgY8aPZrly5ehEaG2dhRdXV10dXUxceIU3njjDUXHUdCpDFXZdIbJkyej1+sJB0P4/X76+vooLi4mm82ya9cu7r7nHv76yksEwyF+/bvfUDWikpq6WmRBZMyYcVRWVuNyuZjQcBy7G/ewevVqRo8eTWtrK63NLezevoPOtnZ++tOfMmvWLFpaWrAYTWTTGXbs2IFOp2Py5MkUOZ1cddVVvP7GYk6dP489e/ZQXV1NOp2mvLyciRMn8urrr2G327ngwoX87vf/gy8YQBRFqqurqampweNyEwwGefnVV7jxxhuJx+P0ehUjcjqdOBwONm3YSH9/P2effTaNjY2q8TocDmpqaigpKeGTTz4ZQokHA3LrOp2O+tpa/vzHP2HU65Qy5UGdTQaDjmg0Osjt0GAymdTPh8Nh0uk0NptNFdkt8BYeCf4TI/iPgV2D/r8feFCW5dFAAFiUf30REJBluR54ML/dEePFZ54j0u/ntLmnUFtbyz+WLOGvL77AnDlzOGnuXH73u99x9913q9s//eRTmM1m9jTtRSsp3et33vdbhMFdJ9ksFotFHalTqRTJdApjkYWT55+K3eVGAuIRZVrXWIzorWbae3rIiHDBJd/F7HQoIksaiOvA5rBjNZnZt28fo0fX4XYX43a7KXbbcHusuD02Wrv389Ha1Sy87BLsdjs33ngjs2fPJhaLYfW46MvGeW/1R7T39/CNb3yDyy+/XC2y6mjex87duxkxtp4LLlzI3LlzueuuuzAYDHi9XkpKSqioqKC7u5uOjg6ef/551q5dq4hapdKqiyLrtbz/4T9p6+liwYIFtLe3Y7Va0cjKqGo0GsGgY+OObSSk7EF0agU3L5vNsn//fhwOB++8886w106n0xGLxdi4cSM+/4CYL7IOnzeKt3+wZpFEV9eALkKp041eEmjavot9e/Zy369/wycffHTEdvOlDFwQhCrgLOCp/P8CMA94I7/J88C5+effyP9P/v35whfonRSQSCQw6PSMdJXyl/sf4Nz5X2Ps6DGU1dWxZs0abr/9dtra2li1ahXt7e3q1La7cQ/JZJK6UTU4ZC2ZXJbNrY1EU0NHml27duH3+zHqDYiiiMPhoDsSYHd3O1FyyCiLJAmZPfvbuPtPD7C1dS/7owFWbdlAq7eHns799CYjrO/dx2fr17F8+XJ6e3vZv7+DWCxGLBYBMY7VAdYikf0hH++sXMHDzz3FhRdeSFlZGYIgUF1eQUwPoSI9f1m6mE82rSfsD1BWVkYulyMejeGQtKARePTVv7Jm7ae4ij34/X4CgQB+v59wOKxWVRaooleuXIkgCEqPayxGNB5jf8jHjs59NHa1A4rBFjKnkiSBRqB6/Gi6YkE0djMff/zxkN7ReDyOXq9XCteSSYqLi4eM2gXU1dVx3XXXYTQa2bhx40Dpryyg1djZtb0Dk8FNe3un0jFvt1NXV6e4JL19tH6+mx9dcjmr3vuAD99cyqnTZqE7imzml42DPwT8EigwOrqBoCzLBfK4gtAUDBKhkmU5KwhCKL/9oFt6qAiV3mRUT5hoMFBXU4tO0DBhwgTmzZvHihUr6O/vx2azodfreeqppxg/fjz79u2jtLSUiy5ayEknncTixYsJhEK8/+Zb3Fdbg81mIxKJkMlkWL58OVdfcxVvLvn7wI/QCDz22GPMOfEEzjztbBKxOLKgjM7hYIj3l73HhAkTSGbT9PYr4btCp895553HlElTsVqtvP3uW6xb9wJXX/1Dxo4dn+fXM1JRVakYk0YxOKUvMUgoFKK8vJxxExrYuuNzJk2ZzKpVq0hm0qrRWM1mpk6ewut/e4PubAyj0YgkSWgNemLBEAadnlhG4IXn/0pGzlE/ZxobNm1US4ULEaSRNaPYtGkTLpeLxsbGIS5GMpnE7XaTSCWRkHEXe+ju7RlCpFRYjKfTaQRBoLe3V61rLwh2pXOKXGBDQwOvv/6GcuMMqvdNxFNEIjFKPOWUV1awfft2wuEwBoOBq394Feeeey71ztIBaUiRo6oFhy8xgguCcDbQJ8vyxsEvD7OpfATvDbwgy0/IsjxdluXpOsNAY19GA6+/+TduvO1WZk6ZRrHDicdexM9+9jOm5hc+a9eu5eabbyabzWI0GjEYDMyapUhx1tbXUVlfy7p16zjrrLNUAsyxo8dgNppYuXrVkN+h1+v5/e9/j0R2SA22y+Omra2NF198kW3btpHNZpk2bRrz589HkiSeeuJJrvn+FbzwwgvccesdvPrya3zz69/i1l/ciC6nJIbGjRuHKIqIosg//vEP0mmlaSCVSqHT6di7dy9er5f6+nq2bduGeZBES0YDXf5+jA4bqVSKTZs2UVtbi0ZWjC6ZTJLRQEZUti0oQww+rkKlZAGDRXYPhCRJQ+g7CihENpqbm5k9e/awUoJlxSWcd+438Xgc+Pxd+Pw9Q973+Xuw2gzMnDWZt15/hY8/eJ+mHdvYuWEdP7zsYkaWuFU+G1mTGeC2+UJ+m6H4MiP4icA5giAsAIyAHWVELxIEQZsfxQcLTRVEqDoFQdACDmA4zQsVhXCTLEBSC8ZSF7aKEsptLh684x7OXL+FLR1NfLDsAyZPmQzAli1biMfjqm+4ZMkSysrK6OlRTm5rays63YCcSCgSpqmlmWeefw6PR6FXi0QiSMjYbDZuu/NX6u/R6/X0dHXj8XjUEev4449n5cqVaujKaDSiL3KwfuM67r3/tyRSSX77m3vY8OEnXLRwIaXl5ejKnOh0Ourq6ti+fbu6BhBFEUEQ8Hq9WK1WwmFFgCmTydDV1aXQu+lEuuMhomQZO3Yszc3N9PT0kMvlKCkpURIhNbVKPD0WI5uPcBRGXpPJpEYlkskkJSUlBxmnKIq4XC58Ph/FxcW0t7cPeT+RSFBZWUksFlPP84HeptVqZeLEiZx++un86+N3SKT60BsZQt2RzgZwurWUVVgg1kdx8SjIhdHIYNICuZQyuAza9f9aJlOW5ZtlWa6SZXkUsBD4lyzL3wU+BM7Pb3YZ8Fb++dv5/8m//y/5MPIShZaveDxOTqPwnmzb/jmvvvIyiWiMW355I6XFJTzyl0eoqanBZDKxZcsW5s+fj16vV9vbLrroInWfvvZO1q5dS01NDaBc8FAoRHPjXmbMmKHWTQiCoJSMJhK4XC5sNhuhUAhZgM7OTtLpNBaLhQ1r19HT00MmlVa76+1WG26ni6997WtccskldHfvJxgMs/iV1zDp9AR8ftxuN5lMhoqKCqxWK3a7HaPRiFarpbe3l76+PpLJJCaTaYhPq9Xr8AX8JNNKtq+waATF8BKJBPYiB16/D5PFfJDorKKKplWNutDNU0Amk6G2tha73U4kolQuFqogCyi4RcFgEK/Xy/bt20kkEmQyivZmNptl5MiRfP/7V6LX6+noaFMYdfMTtiAISqIoGsbtceH2uHA5ixBQtpGFgUc8EVMfXl8/Drsd/WF1fgbwfyMOfiNwgyAITSg+9tP5158G3PnXb0CR+D5iaGQlHt3b28sn6z9Db7Vw3NTJ3PyLX9LZtI+F552P1WrljTfeYNy4cUQiEQwGAy0tLezapQR5JAHGTpuCRqPh4osvHrJ/nahl0qRJqm5NZWUloVCIDz74YMjrBWi1WubMmcPOzZuQBIlkLML5532T199YzONPPsETTz3J5q1bWL16Nbfd8WsuXHQNV173E26//XYaGxuHTVgcqiter1ckrw9ssgBU9wYGRT8G4Yvcj8IxHvi9HR0dWK3WL/xswS0pNIwUkEwmqaurw21zMGfqdFYs+0A9zgPb7Q5M4hwOPp+Ppe8v5f77jzwA9x8ptpJl+SMUyW5kWW4BDpIHlGU5CXz7y3xPaanSYOBPx9kfDWK3Wllw8jxefuRJciPrMJvNWK1W/vnPf3L66aer0YOtm7cwffp0mlv3EQ2FWfnRx4wZM0aVFNTpdHR2dtLU1KRm6SRJkdRwOp2Ul5ezfPnyISNpKpXipZdeYvSUyfT19VFeW0ZLaxtr1qzB6XSSzWa5+aZb0SKwdNkH/Pj2Zzj++Doe/N1vefzxx7n40ksoKirC7/erI3CB46XAGV54brFY1Ecul6O/v1/NdBY0fXK5HMlkElEU1VHa5XKRSCTUY0omk8RiMdxuN93d3YiiSEtLyxABrkQiQUNDA/39/QSDQfx+/5CGblAU4MLhMMlkkkmTJqmzgcPhIJvN4nG5ueq736PYYKZl6+eIWmmImyHLMpFIBIvFQk1NDXa7HVkeyjpW+K5IJEJjYyNbtmxRJc0Hq1QcDsd0JvNQ6O7tYeHFC0nnJPRaLQ8//DBvvvkmC752JuXl5XR3d6t9iACNTXv5zne+g79foX6LR8Js2LCBU089Vd0msL+LFStWMGnCREKhkHpBi4qKhoTQCv5saWkpiUSCX910C7+67GqeuvW3XDDjVPp7+1izZg07d+7kiScfIxQNcdZXFzBrzhxkQWTKtKnccMNPELSius+CISeTSWRZVoWi/H4/JpOJRCJBNBrFYDAMSYJEIhEqKyux2WxKGDGuVA6Gw2FiyYSakldClTGQZEpLS9Hr9eq2B6oH22w2qqurCQaDGI1GOjo6hpASFdYvfr8fq9WqxqwdDodC4GM2YbcXMXvmTJ579lmMetNBrFzxeByPx4Pb7cbhcKi+fKG4ShAEtm/fzltvvcVrr73G5s2blbr+Q5EPfQH+Kw08m81ywgknsHu3IsVXXl7OVVddRSaTUVf9K1euHLL98uXL1RTvqNGjVe3IAsZMmYxWq+XbF3xnSCp47dq1tLS0cNxxxx30O1xFTlatWoXv8ya6tu7GmpIpKyvjggsuVIuFHnvicQAWXnIJ3d1Kdd/K5cv53iWXHuTbHgqZTAaNRsPevYcmvNHpdFRVVKrTfaFUeDA/+nDS4cOhsIA81EhZXV1NT0+PUiCW7+uEvNs2cxb33nvvASRKw2NwzU9BAnLlypW8+uqrvP/++7S0tBzR7/0i/FcauF6v5+9vv8Ujjz6M1+slm81y5plnIkkS48ePx+1209PTw6233orJZMLtdtPU1MTChQsxm83Issy2bdvYsGEDdrtd8WOzGbx9/bzwgpIdLaBQKzFjxgxgQFpDFEVyuRyrP/uU0vPm8pvnH+X9f/2L9Wv38u6bnzBlwjyCXpFcysF3LrgSvTfBKaedwtq2RpBl9u5pZOLEiUOOa7D/PFgprSD5N9yavOC6FCjgcpkshmgGe0Im3tE3JANZkEUp+O2FRSwMEIDqdDoCgQB9fX3U19cf9F12u52ysjIikQhjx46ls7NTLY2dPHky5513HkUWBx+uXII30EhG6h+y/8FoaWnhgw8+YPHixbzxxht8/PHHdHR0EIlEsFqtR0Xwcyj81xj4gSQ7Iyqr8Pv9LFq0SOm4ETT8/Ce/oLp6JPv370er1bJt2zYkSWlw2LRpU54TJUEymUSr1dLR0cGCBQvQ6/UkEgnaOzsQBGHIhbXZbAiCgN/vJ5PJ4M0z3H7++ecYzSb8fj97m/bwjW98g+bGvdTXjqasrJyO/T0UFxfT1tbOjh27eO7pZyj2lLJrzy7QaHjqqaeGSBSCMgKKgtJgodfrVXfIZDIpafz8ItNoNJLNZgkEArS1tREIBLBYLPT29ynRnkAAo9GInMtR4hnwr6PxGE6Pm1gsRjweV92PwdBoNKqvfmD40OfzYTQaqayspKqqSl0rWCwWjjvuOGbMmMXcOV8hJSXZsmXLkMjJ4FBl4bkSWlRG+COdXQru2ZHiv8bAD0SBxri2tpbly5erd/sNP/kxE4+bQHl5OV1dXVx66aWAUta5atUqFi1apO6jr6+PHTt2qCesMDWvX79e3abQY+j3+4csxqqqqpg3bx6xWIyW1nbmzZvHvFNOpWpENStWrMBqNrJo0SLq6uqoq6th/fqNfPDBB3lXR0NNXS3jx48/omPVarXo9fphKd/S6bRqHIUM4oGfHYxh6MqHwOVyqe7HcO+5XC51ofrRRx9RV1fHaaedxvz58znjjNNIZpLcdddd6mcOS1R0tCZ4+B1+mb3/v8OBd21hyt69ezebNm1i/fr1mNIZPBh44aG/cOU3FxJq6qDn80YsFos6ChaSFgWRUUEQ+OpXvwoo8dk9e/YgyzJjxoxBq9WSTCZJJBLEYjFOOOGEId+v0WioqqhktMXDtp07mLRgLt5AE8XlWjZtW8HWHR/hcEs4XDD2OAdr1nxKJGDE4vbQ2dlJKpUiEhmq7zN4Ko9Go2onSyaTIZvNDllopdNppcoynxwqjPqFOLXP58NoNin/Z3N4BCMN7kqk/vCAONYBKChEF7KUg3+P1WrF4XDQ2NiIJEmcdNJJTJ06lSlTplA7YhTTRo7h3edfwpH9YrbneDxOPJaAnAOybsg51JH5kI9YgnhEB7kiyDoPvfMDcEwb+GA/FAamp+gggnubzca6dev400N/ZMPadQiAKGg4/7xv8Y2vn8O2bduYM2eOmvjZunUrFRUV6jTd1NREOp1WO0e0Wi2RSIRp06aRzSpd/aFgUKU5K0yviXSKFStWcMstt9DU2MgTTzzB7t278fn6qa6uRBQFlv5jKYFwgE9Wfci4cWOpra0n4Atit1vVBdzghZwgCEgoUZQCjfBgn99qtWKxWDBalNf0ej3BYFCtg0kkEmonjduphAiT8QG2rNLiYtxOF6lE4iAlDJPJhNVqxWRSbgiHw4HValWPt1D/Xl5erkZ/DAYDxcXF9Pb2MmbMOIJeH6FAEFfRERqgrMkbbzo/Mg+3IB14zWS0EI8nicfTw2w3PI5pA0+nhj+QA6dZjUaDRivy50cexhfwq0Zz/fXXc9ttt9HX00t9fT319fX4/X4aGhrQarU4nU7V/Rg5cqS6P7/fP8R1qci7Lt3d3UN+g06n49133+Waa65hzJgxvP3uO/R5+1m+fDkGgwFRAn9vP2F/gJ07d3LiiXP49NNPyWazJBKJIa7Q4VBYAB54/IdyXQoz+YEuy+Fm+OnTp9PV1TWk5ayAQoRKq9ViNBqZNGkSNpOFX1z/Myx6I3//+9+H2ePRYDhzHHjN7y9Udhy5CvMxbeDZbPYQ8h4K5146myGih4RVR3c2RtSkYeE1P+DWP9yHqFN8z9Pnn8bTTz7LtddeS0dHBx6Ph66uLkaNGkU2m6W8vJxEIsGkSZPU0dJgMJDL5Zg/fz6guAKyLNPe3s7cuXNV5leTycTuxj009nfxrSu/R0Cj9BM2NDTw6eo1lFSWU+RyUjlyBE0t63n9b4/T1a9kVc8++2z27dsHDFUyjkQiamVfPB4nGAySy+Vwu91k0xlSXT4cSbDmPZWC6+Lv61dqvqUcET3oKz3kisyIOqUDyeawE9bJBHUSXanIkPXE4GKqgqRhZ2cngJpBLSoqori4GJ1OxznnnMOMGTOoG1nDHdfegBCIcM+NN9PV1aUuwg90KQe7JWZ9JWZDhUKeL/qVv5JdcT3yDyntQEo7iIcNxCM64hE98lH633CMG7jJbFKJIQ90VwpTZywRV2V2IknleSAU5Nvf/raagpblLNOPn84/P1jO979/JfF4EklQSB57e3vZvXMXXq8XQRAIh8NIkqQqD0SjUTUObTQasVgsSqePTqf6oo8++ThzTj6Ru+/5DYJWZO+eRoJBP6+/8iovvvhXslIOnUFLf38vBoMOu91Of38/fr9/iE9duJFjsZgqr1dI9ORyOcLh8BAxwQJ7l9vtRqPXIYoiTqeTdDajnpNCwiiXy5HJZZGQEUQNXq93oBQ5T5lmtVrx+XzodDq1riYejyMIAlqtllGjRuHxeNDr9cyZNZu5p3yFeDLBE089iV6rG3JdgCE+dGHUjceSeTcjOUQLSeFi1wIa4vEkyWSaZDKtHKms5d811WOaFyWVTBEIBJAk6ZCLosHQyIov2dHRwfj6eo4//nhuvvlmvnL+19VM8dkLzmLh+d/m2ReeQ05n6ezaT8qYoru7G6fTiUajGdI06/F41Fiy3+8nkUhQXV1Nb28vBoOBtrY2SktLmTBuHE888wxPPfokt9xyE+s2rGdvYyOlZWXqvmKxGLW1tVRXV7N69Wo1OjIY2Wz2ILfii0JoBdflwGjJ4M8W9vlFvYyFY9fIBwAAIABJREFUCEnhmHO5HGazGYvFwrQpUxnXMJ6KigpGVo/AZrEqRWmxOEteUARZ/zPRkiN3PY4Ux7SBy7JMOBxWqwoLtShms1mt5z6wg7sQlVi9exvlk8byr63reeTxx/jBokVcuPBChXo3LXHtBZey6OLLiaZi3HTLzWzbto2qqirVRfD5fDidThoaGti9ezegGEtHRwfjx4+nt7cXvV6PKIqEw2G+/s1v8sQTT3DLLbfw1BNP87vfP0A2ZeSdt99n3fq1RBOd2Gw2du7cyZo1a1Qft7+/f4DSOO/bFqIYnZ2daoXhYJhMJqV5QRSJRCJqal+WZbLZrKrarNfrFdZZkwmTyYRer8fn82GxWEinFTYwrVarLmptNht9fX1KVrSqiqqqKk444QQqysqpd5eDpHA+GkQD7638kM2bN5POZtTPD8FgAVPJPkhuXBWCJBqJoRELxPfxQe8fHYH/F+GYNnAY0J3s7e1VF4+DpZ4PFfTXGw30eRU3o762lmVL3+df/1zBDTfcQMP4BuKpBDnAYDTy0B8eJBKJ8Oc//5menh4sFgs9PT10d3czefJkVWenUGE3YsQIdQovhCvtdjs7duygurqSO399Bz5fAJ1QjMlkBXLE053qbzMYDPh8PubOncuGDRuoqqqip6dHNb54PE5RUZGazQtGwhhQ3C1RFCl2exSCSod9SPd5AZlMBqfTid1up6enB4NB4UUsLS1Vu3WCwaBal1KIHqXTaY6fOYMTZ8+hrqYej2cQfUZawqg3EI/GWLt5M+s3bgAOljpX3RFt/rrIAia9g0QiyYG85hrtoGFfvSGGG8WVzx1tLTgc4waey+UoLy07Kh6M4dDe3o4gw4QJE7j11lspLy/ne1dcTs30SarrUmRzc/stSoIilgpz2x23s379elKplDp1azSKXo/f72fUqFFDGgEK9SofffQRDocDj6eERERHJBJCQEYzqCI1m80S7us/KFRXeO9AlySXzijiauTT7cO4A0ei+zO49sPlcqHRKO1/TqeTr3zlK9TX1mE1WxARldmAoZ08fr+fF1988aDY/eGgrCUs/PsuyL/vuhzTBq4RNfT09eLxeMhms0jpLK4Sz7AUBTCQzhdksKTBLpohliFqNSALsLF9LzaXjYRVx0PPP0Xknl7mnnQSP//Zz5GRSaeVBZ9JMHDToh9h/6mdqEFkyZIlrF33GV5vHxqNhkgkQnl5Oe3t7TgcDkKhEP39/WpkokALl03nqBtdzxVXXMFdd92BTqdTNXqsLpfqRhRkB3O5HIlEAlEUKS8vp7W1Va3sKxRvBXQ6wgZFpq9iUIw6l8uprXrZbJZYLIbL5cJqVajQLBYLoVCImTNnMmPGDEwmExMnTqTMU4IunsGo1yu9j0kZUFpqJY0yYwSDQdZs3cbatWvVyr8CCu7QQZAFlR7CZE0BR14JqNTVKGUJ8VTXgEzhv+G6HNMGnstkqR5RTTQUJugPkMvlqKobRSKRULQuD3BTUtkMBq1OIaJPgyUv8y0LKDIZMgRjEbKSws1d5vGwdfMWrrjse5RXVvDTn/6U4uJiwuEwo0YocXGtARYtupxFiy6nu7eHtn2t3Hv/fXR1dVFaWkpfX5/il+q0au10NptFkiQCIT/9/b0KH7lOR2VlpZqZNJpN9PT0KDdCPqHkcrkQRUWFIRwOq4xagqAkf+x2K3JO6QvV6nX4fD7sdjvxeFxhzLXZ1BR7Op3GbDYze/ZsZsyYQW1tLSNGjMBsPJj2TDVuGTRaUfX5Y7EYf1/yN1paWtSQ7QAO7zYciUboAPLSjbIA6AfpIuUGvT/4u48Mx7SBa/U6Qn5FgqTI5STQ7yXsU1TJCj2Wg/FFdRaF9wZvE4lEkLI5jEVFpNNpLr74YioqKpg+fTrf//731UGogJGl1YworWLmq0sQDCJ7Gxt5+tlnaG9vpbu7F0GWmD17Njt3KmW8Pp9PbS4+iGzS71cXsvv37x+UWFEu3uBWM1WFTQC7Y2A/rvwsUF9bx4hRIznrrLOor6/nsssuUxeVHqsLSVaaN7QakaysuD/DKUbLguJq7dy5k5aWFgKBwBdEaP7TEY+jGZmP/LuFw7RF/j+F1miQtcUObA47qVSKWCxGZWWlSkLZ1tY2JMNXKMyHAcMUZPDozCTjcZU6oSDzWhjhQenQ0Wg0VFZWIpQ4aGtrQ5Ikpk2fweWXfQ+byYo5lVH3K2kUfzkny6xobKXb58Ni0NPdspW3/vZ3ErE4Wr0i1FpTU4Msy2q6vxDBkCSJ0aNHs23bNioqqsimzPT1+nAUWUlmFJqGsWPHYtSVUF09knFjRlM3ppTy8nKy6QwVJqs6Uhcozg6E5hC2IOhEfD4fXq+Xfc0teL0K8WcqlRqi7DwsDqFuPDAiS/lt/k3bUhcZGpCsw0Rg4OGHH94oy/L0w+3qmDZwQaeVbaOUktJoOIK9yIEkSUycOBG9Xk8or3VeUEUr1EQP2YcMtvTAuT7UdKn4fIrphw0SJWWlOBwOent7CceiWA0mzpo9l6+fdTZOp1Ph/UgqTFgat0ggEKCpuZlgLMepX5mHBoFkKsMnqz/i3feWqt38MNBHKQmK+ttZZ31d0YKsnorXG6CrqxN3KZwwe05eD9SAnP9tAkb1uKyZQ9tQocu9EGdPp9Pkcjn27t1LKBTC5/Op5bAHds0XcEj3Q/TniUoEyBXlz90BLov2ywUGAHX/w43uR2rgx7SLImoHspdFLueQmHchKXO0K/rDoWAvzc3NajNEdXU1FpOZtWvX8urLr1BcXExJSQkLFy6krq4OW9aPs0hD7fQxBKlk+54dmM1WRlRXcca8r3LiiSdjMpgQ8jEbGUnJKMogCjpApqO7je6uOPNOmU8wmMBsVyiFrVY7OfYjULjMVco+DpNYKRhte3s7gUBAJRcKh8OEQiGFLHTQYvHQGJA1P/x2/xs40t+j4JgewUWjXraNLMftdhMOh8lms4ypH006m1GbBVKpFM3NzapgEQxEUQqnIZJPFhZGvcGuSYGDPGAIYDDoAA0mY9mw+9FqlFS4qNOicdvZ/PlW3A4nsfYeZs2czkknzqVh0gSKi4tVxePdu3dTN3o0Ee1QAyiUszY2NTN54iQcVgc5UogovyGZGVyDIxAIKIVGPX29Cg+JDJakRCyiuBMFhilQGocLhhwOh9VOoEI/55FfgEPQ1gyeNg5xp5ktR/ldByAej4MsKDUrBRcoNZBLeObJN//7XRSjzSJPOkWpwY5Go5SVlakLs3jep9bpdGQyGTZv3szI2hrSiSSCDCWiSS0VDRmVi1twVywmszrDlpWVsWnzVnB56OrpVrppjDJmsxGnzYHsDZLLKhRkMlpAyeYFTRq0Rh0uuw2PZEbO5vD6fQT8ITRCjpO/Mpfx48ZwyqnzMZuN+JFJZhLIghKdKDTrBoNBdREXzJflglJGW6hTGdyuJgmQTaUV7UpZh7dPUXHz+n3qDFdITH05fEk/+ktAvTHyBh6PK1nrwW7PM0+89d/vogxGISs3HIdGoXRz586djB07VrkmoYSa2BCNB1/0wsBTqC3529/e4D+Kd94e8q/rgLfH/Ge/7bC47tpr/5e/8f8CZAFZkBGOoqrwmK4mTKfSqpxGNBpFr9er4TbzAUkOo9FIfX09n332GTlZIldkJmIUiBoEbGmBMtFMqdY8xD2BAZL3/9/x54cfBlCZsA7bQfMl3It/B4f63sH/h7VFyEWV9GWP/Hod0yO4VqulqkpZVBXCgel0mmw2i6jXHRT3ttvt1NbWsmfPHsrKyihyuxClgdLS4dDb24u9aKCrRve1PUhiBCmeBp2GItFLIhkEyUgOA+bEe1z2zUq272yi3HMydtNUTLUZdAYtGjlH9/YN9PTuByR0lv3EkiFcNidFMZlEOImtyEY4FEWTXz9LuYG+SYPBpM40Wq0WjVZEIIuMRvWvC65WYRArPFfS+0okIxGLYzQPJHSeePJJQDGWQ4X+Do4uScAXdc4cvNg7+KY4ugXhF31Oq9WTTEfYuX7zUe3pmDZwvUE/7OtOp1MNfx3IvTdt2jS8Xi+7d+7C5XIdlKw5HARNBCw+yERwjK4ntK8OszNvLFIxZk8jvclOxs+fxrN/2oFNX05s7T6SUhaNDJaUF51Wr/BfaxtIJGK4HEZqpDWIYoaMDBpRRzaXBrJoMeL3K+W46XSPWlmo04vksooVSxoJj8uNLEgEfEFAAkFSDF9pciObHjDweCJKojuJADhdR67rfnQ4EsM9gm2GvUAaZAbIsOLxOM3NnxO1iEN4WI4Ex7SBy9LAgVutVqWk02Il3NaN2VFEToCMnFGrCzOZDMlkksrKSjyV5aT2dGJPgU8zfIESDC3QB8gkOvjTj8dyxw2v84dfT2Hjus945e8TCZgkJEsbZeJETqjK8chr75OWF+J1JcEwDVkGSdaSjBUTSjeD1ocgS2hsGqKShnZpKrLYjxD1YQ6biYTjmMx64v1rQDJSO3osRc4yXC4XVVVVjKqpwFmSRCP2s2bpS4wb/1X0uirWtq6ldX8b7S3NZH37qKkaoWRMcWGzOQABWZfF4nagkSQCoeDwB37AOShgcLLGbBtmVFbLX7UgZEEchr/wqLY5+CboycXR6UVCwQitrZuUWUcDMf+huRIPhWPawEWtSDKZVBptjUbEfGbQ43IR8PmxFzlUwy6Qz6gENlYzI6qqmF0zno8bt7G3uQmtVqsWHhUgyBrlIuRhCHdz/Myv8OAL05lyXDGRSJLJ/TvYuu0EfHKSzq4O5p12Kk3RSha/dRx+MmRQ5KgFIYvY18IPLp5E2QgTyz58nO0bJAyG40gZZhKLtqKVOtG7+9En6rEbp6EfUwNCDj8aOrud0A3Cdi0WWxPRXCN6vZfLTvLQ1RPk3XeW4XOcRMXICcw4tZqyIgOnnFSDUQR/BGQ5RVdXB017d7B95y5SyRy6wPCyIoMxvL+tUTpuVAxyGwpGKWsPMQIfsM2Q74qqhVTKNspDlhXqOa1WSygRVVXXTCYTsfzvKzRvHA2OaQMHhX9k6tSp9Pb2DtFucTqd2Isc9OUOHRIrRJ6nHj+NaDxGc3MzsVhsqIajIA0ZRb49fwYr3o7QMLuIW3/yD/qaarjg7sms294BgoS3px+HfQbXL7qIV/7egZxLgxxCqcCTcbpe5s5fPMnbqxZz141nkPaO5Sc/+JBuWyuEV/L7Z3/K8RMzrFgW4tlHmvBlapHz32+o7gckcpoUQf9Y9C47oqGf1tZXqKuuQRZyBGLjSfaWs2t/Bo8c5e33t6Mz6unx7yAdi6MzGjGZQpTXjOKGHy/k4z82wYbP/r2TXzBeWQDhS8QjBu9nWLdFwu/34/V6aWppRls+0F10YPTL5fIAEmGOTIjqy2r0FAmC8IYgCLsFQdglCMIcQRBcgiAsz6usLRcEwZnfVhAE4U95lbVtgiBMO4L9q+ywUm+Qco2ZMlGJYQuCQCQUxhTNYItL2OKSmqrPZDKEe734DRLbtBHS2QxnnHEGJSUl1NTU0NraSmdnJ2GDEiMPGwZOQ8VxAo//+X2ef2o5sqafO580EAomQCNC1oXBUInHVo+0rQWP+3l0UjFouwEtpEcQTZ+Npj/BVZf38rWFT2Gx6PjDH0pJ2ozMO7WchTVBXv7T49RbPbz/9mymFLegFTuQTAl0uQr+9cpJXDd1CrKxn2RaSzRcSmP7eKLOXSy65Rt8+yKJWZO3U+VZQZ82Rrg6RbuwBWNpBdbyuYw67ltEayfTmqzgz89+imHauYc+wYdDzqU0AedcCn9J4fmgrpzBOGQEJufKNw8bIetWnyeTaYLBIG1tbWzp3se23jZ0FW6188jn86nX1Gy2YtRWIGeKsJtrjvgQvuwI/kfgH7Isn5+XCzQDtwArZFm+TxCEm1B4wG8EzgRG5x+zgEfzfw8JjaAZiBqkZAREQMJsNqu6OZBPhOSfFxJAoHTeW0xmRo50KsKp55zDsmXLmDZtGhs2bGB34x7iqSSjRw0w0b740rOUlZzJdy6YjUGow2kTOOUUC71JC08/24vdakaLzK0vvcgrL/2c6bMfA0cDgmEfWv1uDHEbbpcJe2ktUfccTvveCxxXIYP2BCpLy9CbbDz+spln/v42k07YwyN//Tmzv/YokrWaWCjOa69s5oLvT+N/3uqF4mJyQo5Av52fXXM7d932CCdMcTDrnJPRGCzMvW0N8X1Psezxn2KrKiWTcSIl4PPmkTzxwja27wjyk8tPVI8tFArgcDjV83QoFBa6R5Qw0g7vxij7L7ggEoI8cI2MRjOhUIhEIqESbEbEjFpTBKilxyaTIb9G0GDWFwECVuvBrFuHwpfR6LEDc8kT3MuynJZlOchQNbUDVdb+KitYiyJ1Us4XwGAcaINRODEGRozhFo2Hipb4/X6cTqe6gJNlmbPOOgu300VFadmQSIxeq0iLOOwltHc0c8K0C3nu2XWs+GgZOVG5uVq7u6mcMR1JDnPh6fVoZCOYotx432kkk0kCvh5OPnEKMvUIlols77EhCCleeuFvBIMhyqdkyYiT2LrpDCKJ3UAETdaEjI5H/vQmOlMbxpFukHUIsg6/34CQE2jvlLjt5bHMvbSXUy/cR3r/NMSekZxadByL//Ioi//4Mlve34K5eSVnzByHs6wMk/7grqHDocAVc0QoXIgvcD8GbwYojRv5x4HvFeB0OvOP4cjx/3d4UWqBfuDZvBDsU4IgWIBSWZa7AfJ/S/LbqypreQxWYFMhCMKVgiBsEARhQ2IQk5S7RFBStaKfsEEi4zKTdZqVxbgkIeck7CnQ+ePo/MroZDAYSCaTbN++nUceeYRt27apRJvd3d1c851LyHR6MUYG4r1Z30foGuI8ft8exrlizLv4bGZOP567r7sAXVymV7LzXGeY2RMmc8d1bdxw7zlI0Q703ho+/v1zhOQy/vRphu9d4MWQWoHBkMNon4JkkSmqm89vnm3lzfuuZHbJW/ziLBPOvRqq7NVIJg1Zex+pgIOyjMycyi245HIEkxu5fg5e8XMmjqsmmfkUk9tPzhSBEe3kHBPpMcG8k67g1WV1/PylKD98u5s/vLOWYFTHzv1DW9mOJIlTaFI+IhzWjYF+UlROa2DCqSdgMBmJxWKIOi0B/cB1HBzJKSitWSwWdDpdXrlCj6sEXCUCouHwkaECvoyBa4FpwKOyLE8FYnyxLMlRq6xptFq1oXewzEYsUfD1lBqFVCKJwWBQXRN1YS8qTcHV1dUcd9xxGHSKutjEiRMRRZFPP/2U++67j0mTJqn7thoNvH7fD1i+ahXv7JGIeWvx+faxp/0j5NzbpKUuNqzZzbQZFZx2djVaIc21Py5FzjpYtX8G9sqRPPvMC4yeWI+kyaIBRFmCLfvw+yt5aWUJ8y9+mlOv+CrF81I4im151TAJtONxmBswaEfx8x//kJwgIiMip3MkfBP58Y/OZsObU1i1ZCZXnF2NPrGJImcVy9tkikeA0e7F6gyTy4yG9ETIVbB06Qr12L5s8dOh8wmag54XiPhLSko4++yzqaurQ6vVMnnyZDwuheF2cHhWp9Oh0WgIh8N4PB61M6pAWVdZWZlPVKHWqx8JvoyBdwKdsiwXluhvoBh8b8H1yP/tG7R99aDPD1ZgOyQK0+WBCR0FB09/Q7q2D7gghe1SqRQjR47E4XDw3HPPDalvCYfDaPqamDh5Mks+bKKzXaJilIeXFv+Zp9/9Gdj97GwN0RdtZdWapSz/8BVuOHMaoiyhy81EkDX0dftx6E3MnjaenEYGycC6j76OaFpLxtlCOPBt7rm3iXvufQ+DKZ/MkgSErBujsYyHH3qVylJR/c2ucjfnnvk8L7+6hl9e+hF3XP1XfnBBEX+5+QICQT93Pb+CjC7ALXeew0UXzeSr3y7GUbkF08g9dPd08p/C0RBLhcNhampqGFkzCr/fT3NzM83NzYpawyH2k0qlGDVqlOpOFh6FG6uoqIhf/epXvPXWW8PvYBj824tMWZZ7BEHoEARhrCzLe4D5wM784zLgPg5WWbtWEIRXURaXoYIrcyiIchZbxosAmPKhvayUIyv1YXcUgSCTBTKWBFm7nnQ0jKdMBDlCNqAnFkvQRz9Rs1kdFbT5WaGQFCotLR0yIiw4/kQa63fwte+O5p6H1xK1wJVXLEMjnM9NP3odKSQT7hiHoK3h3d1G3trXgCHt5fiGjWzd5yAmlpCtnMns6x5g6d0/5/SL7iYgOOlqv4SxlW7iggufW48h6edXF51CqshIqn88Rm2KVPFe+m17WbpH5OpMJ/p4J6LLgF+bg4oJ/HGJTLxiAuZmDTuvuIfnnruWaSOnsuXzd4mvzWCTQpw3ZToNphpWzJvK9256h3h2KMfgwOLv6Oq3wwYISXG1IlPMhw1zuZw6exYUKxwOB2GTgFRsoynUp5Qj5/3tjF6m2+cjJGbRibohbAB6vR6nU6n79/v9zJ45i+7tjcydMZvLLruMsrIyZdQ/isz0l42iXAe8lI+gtACXo5y91wVBWAS0MyA89R6wAGgC4vltvxBSTkIzqAajAIcsqtOtMz/6ZjIZjCiJhCK7C/Ir7wI6Ojro6OggkUhgNpoIhkOq+NFg+gabxcpUeQK7lz/DTy87hWiujHWfdRIMBulrNGKPlWFO67jorKXk9JXkSPDgQy+RLbeQTCdBH0FjmoovMJqv/eiPvPT8bYxxgwGI+z34cWOy9HPlolmcc2Y19zy9k35dFbKtH8IlmBhNX1sn/f06NEWrMUg/JBPqxxBbzfN/uJjrbl2GN3syzbkcRF3UT95F4+oJ1JxWwQ8XPktnoAmjRUdctCBr3OjFgYhDJpNDsSdpyDlNpVLq+SxQTcNQVyCZTBKNxxBkyGY1xEIRZAGVy2XEiBGIoqho+AiKal3h84NdI61Wq5YED2b2yuVy2O12NUfxy1/exIRxDbg1OnUEz6YzBPz+IfQXh8OXMnBZlrcAw9Xkzh9mWxm45mj2L2rFYQ/G5XKpFYAC5OfOwm2tUZ8Nl2QrKI/BgPsz2MADgQAjs1bC6Vaat7xIUqpHE/HhIMekk4s5edZ8zLpaUkU6PmrbyqZ9mynZU0JnLoVGzpLTJCFbDLlavMlqzv7KEsZo9xPBj37k1xEED0JWxwdvbkYXaeHF11uQ9KPBsg9NbBzkkqTlFIEuHQsW1PHXpVpsWR1iug9jro13nvsqJ136ARlniqgXJk42suxTPTu8bVx09Y955gWJvnAMORdEyCZJSwNUxgeei0KkRJIGWs16enrU8zNY3DWgzWG2WhBkkJISOlGrnk+LxYLL5fpC2cECiouLVYL83t5edu3YiSyAw2bn+ut/gsfpIRxTCEcHf3+BazGeTvLGM08d9nsKOKYzmZJGR1inxEYzmQyiKOJwOBDoVw5eFiBbBDkTMhDWgmBz40UiJnRiKbYgyAK2eBHxuBI3b435lXYxqw5LUjxI53F34x7aLTZsNhtFggWdpo0ig+IPJ/a18vSyy4jHUrTHetHbTZxw8klMmjiHadNn4XAV02Mqp6U1SNf+FvbtDtFqTtO4N4C2fA5WaxatcTdR2ckObRnbVmVJuU5AI+UgVYvG7iclGOingluXbGHaeZORlrUQN3jRmv5Pe+8aI0mWnYd9NyIjMjPyEZGZ9eiq6p7p7p2e2V0uTc5yB+JDWBCiHwRBmIZMi5QMkaZIyPADtmgDNAkasCHSBiUYFmVQskSba5OGLVKiaUqiaPC9pmAuh9zd2V3u7jy6px9TVd1VmVmZEfmIyIzX9Y8b5+aNqMiq6p5X7bgPMJjsqHjcuHHuveee853vfCP+rZ/6LP7u3zzEP/z71zD1ZvjEza/iU//yGLNaA5/+rUN88ps38esHryHqfgQxq4LDQqA4UX7nC38MMKCZDWiaLamcIiBwKZp1mjq5CTGj27aNtGHAbLXAOBAc9GWFaNXcMAwDjDEJzf2BH/gBPP/883LjePzoCM0gxV/90R9Hr9dDpVKR16dWQ9rpUzCYMPDPf+c38MAfi8DP3sXLCF7qjJ7N3Sv82//idwMQUFjRASlQyRBlnMGfmhiNXNh2B5WKlnlWYtRbwsPCOIM+NKGlGtzJFEfJDO7Eg9O2UZtHkg/kt3/vdwEA3/at3wrf99Hv93Hz5k1YloXdKztoO7bkI+QM8MwEDx7sw/OmYEkHacoAJPB1F9OZC0BDGI9Rs5r42Ec+ipde+LfxDd/wDdjc3ENQ38Rw7MJzp/ij33fx+c9/AbMghF/dQffKHjTEsPV9HIRfh2W3AuAACGOAa9jznkHTfgvN7QHCahV3jjeQRDex9/AP8c//8DtQYT0MfR1TV8frd/r49X8R4A/+9nUAQOcjt8CTJZy2jRRcuubUWprAiuyz1WrJ4EvVMJFktGrj8RjebIpuy4Yda9ja2AbjKSqmgel0io2NDXz2wRv4qf/mp/HcC8+jblYzsiYNMY9x85nrYFglgzMuqPYoajlIQ0Bj+Nwrn8f+/gPJl/jCszdx81nxLv/Kzec/GBk9ZKKcBbLpdDoyfa1WE9x4QZR30IglrnxjVbar39nZwWQywaNHj3BwcCArHlzJ2GIrmoGXXnoJE3cKpB0MhycAOEbD38DSEEt8MH0B86mPwy/0wb/wk/inPztErWbizVmMRqOBK9u7aLdTfOeLX4+9Z55F+8UX0WrbAEvx1vAh/uVnbbw6+114hz1wbgAsANv5STzYb6Hpv4RR59uQcgf1uIGtzov47j//y9CTj6H3oU/hw1+3h1vPfwOea+eDxdRXnK8UfHd3N5fQTQre7/cl6InYCxgHOr0uek4HTtvGNcvJRZWfe+45/NzP/RxcBvRHfTSbTZgVHbvdK2AAlkjBkeRI4ejaarWK4+Nj3HaP8ea9uwiCABsbG3jppZdgmiY2Fxr86cVdhMDXgIKTHWbbgjJiPp9C11e0YFZ7CX8eYOKLyg5BNAXjDHWvCact7M+NzVA4AAAgAElEQVS3mh6SJIFudaAdrbgG446R+ziA8Ba0mIACMF0D32ghYMAiDeAPA6nsrVZL1MVs26haKb5+91nEcQzP+z7MZjN4kzFmkzkGgxgpA4ZXPwLvyhhTAB/WW0AiFOrEn+HXfu//Bfhn4Hv/F9ptB1EYYz4awNq6jhs3r+GWsY1/4zu/G05vG7sf+fs46g8RR8BrxzW88eYDHO0f49XjKpbBHnpbFdxe/hi+8P+kwB8m4EYL/1P2bq7rAqnAfyyXS6nUaZoiWixgtVpoNBo5ZSezgWoBObaNXmqgU3fQa/cQpcdgho+dK7v4i9/z1/DJT347wjBEp1pFpyvYgJfLJVhGONSqVZFmahfzPJ3bb/7mb0puxpc+9jH0ej2kaSrYhT0fkVXHV+7fkcRKF5FLr+BkJ1JqmmU1sUxWPvEgCDKgG0OSrAIHtm0jmPngTIPVsuQGSK337vs+6o18Jsuf/cEfvTsv8rkLnjdUft8/Bu5nYYbf+ntvuwlXNrckNFhN0+t0OlgsFrJkN8FSOecIsno+YRLjQ9dvwNAr+JCzhbfuP8DCD9Bwavi+7/9L+NjXfT3cE7HSVqt1yb5LIiP6aQo9O76IY5ycnGB/fx+maeLjHxf4u/l8DsdxZH3Ql19+Ga+88goePHiAN95447He+dIrOM22URRhc3MTd+/exTJewS9VL0tZYrEwS/LVIf7/KNdv3UK35wAZdl2IAEc1m01sbW1l4KY6DMPAzZs3sbGxgevXr6PdFsxi9+/fx7037wInU3zTix/Hxz/+cYTJETRdVMZoNnfx+uuvwzRNbG9v58qkkJycnGAyEXsUTROpeLdu3ZLV3QABnvvs5z+Hlz/zx7hz5w76/b4I7+uP/x0v9SbzyrU9/iM/9jcAiBlH0zR4npfVgJnBtgXDVK1Ww8T1YEwWqGgC9DO1RMkRz/Ny5ECqTzZNUywWi1PsV4/S0+fQb50JVFxZ2Lt4H9d10Wg0hEljt9FsNvHMM89ga2MTV3Z34LRtsWnNiOvr9TomkxkAwZlC+PfZbPUs1/PksyP+EEkaAVzDBLfgLyJoSNGOxyKVjQGMpwgWc9jtBjY2rqJSqYj9hLPEtWvXhFcqq8tDphdNFJzz3LvX6nVMMtIg6lOiyyNXq1ExYTtt6LoukZ1UjJfuo2maZK2KogSz2QytVgtHR0f43d/9XfzJg9dx7949eJ4ny6kU5Su//0df+5tMdcRSR5M7yrJEibsTd4zlcolarYYmqyJZRhlvYCCTeS3LkhzjKqhnFohdO+MAQhGlSzXBm6LSSnCNQeMZLDe7Vr1PygQsgO4DiN+OI9yTw+EQw+EQQRDgT/74ZdTrdVmtYnt7Wypdr9eTtSg553jhhReEeRCGME1TZi9Rmb/+6FX5rFpiSUjqUlslLxf5Ci3Lgm3bSFh/1f5MgeI4lm49QCg4mRm6rsPNopEnJydYLpewbRvL5RKu6yIMQ1SrVVFdriKuofbSvcX/Q9h2B2nC0R+O8fLLf4pXXvkiBoNjaX54tdX3L1Pux5FLreAXEaclgFiMA+GjE6mYV69exZ07d9Dr9TAej0szRNZhVVTpdruo+aLH1xHxl7HarrsXtYFC12+99Ram02ku2EQKvoxCOG2hJKTgRNzZbrehGS4449A4w/NWTVhtYBiYezIaWVzWyaZeRA+lmTcar96rUqlIBafiVQBkZTlAzNp1y4KTeZZe+PCH4dg2Njc3pZepKBTV/PKXv4zPfe5zeP21N9B/FCJYhvBn81y90HdSLrWCqxsVqoXDGINlWUjTFMvlEovFAmmailrtaYBqoyqXRSJ/ByCZoSzLkpgJKhfCGRB3LDlb8AX50AHDDeBwJhipMjOprJ2LxULeh7KzfN8HaquZXm6B65b8rTU7MOwqVIPHJxOpArjzkTR7iI6ZBumkCpg1A4xr+FK0gmty3LloD6OIt6N+JSHTQuz1xWB5czaGpvkAhmg0Gvjtz92B07bR5QZuPHs9q3CxIT0wjx49guu6cuY/ORkA0OBWM1dltYFDf+X+s1BOkEr6UFYZY51cagXXdV0S3eu6jjiO4ThOrqxgr9eTnpbt7W3Zqffv35fn1BTFVKNtJycnpWyzQbhEoyYyiawKsJiJQVD0wJAsl8scb0nuXiVZMeq+JwiCtYy3KQP0VLRBS1erAs2qjmNhHvgA54jTVdCEs5VZEgTBWmw3ta34d7q/irJUTQV1Y0/mme/70EPgi1/8Yo63BchXgbAsKytnAoS1/DllwhjLZRhRAa6LyqVW8CROZGAiCAQVGy3fJKqiXbt27bF8pCouRZWNTv74eTBRgnRyVpYkexpLc3JyIs9f1wYgb/pcFKpaPO+s+69P7L04mOmi5tmTitr+s95lnVxqBefgaDQaODkRxJKu62I6FVV6kySBbdu5UtZBEEjlV21P1axQR78azQNWg4Uxttp4dZqIslwLCytbkswkxgE7ZAjm4lqVqqiFGrSl+NqukSJYCo8NJU4DAJZAG6upjNrq+77IVGLAtKbJMLmmaTmzh9ofN3Bq5gSEWZRWa6f6gf4GACjQ2V18flwJZ8JkUjfoJB4g2+xhlTebZkUH1PcgoXPm87k8h5T7A2OiVCoVBEEgIZXb29vy5Qgk5fs+wjDE8fGxrDN5eHiIdrstC0SpichUuRcQJscs8OUstJ4c35LXkpkSBAFYRRcmhFlXzIPVderqomkaag1Lmhzq+aqpUObtSS9AxRcEAerW2aYIPaN4nKopk6j7lbwZs8KRl11LHCYEmyhzpaply9dVhiueo95/3TdaJ5dawYH8crnOi7G3t4e7d+9eeGSrS/NZdX0ucg9isgXOX5rXeW3U9pSZDWUzc1l7zjNFivctey6Q7+dep6sMwtN2+Lo2v5Pydu5/qRWccAiA2CgSEacK71wsFvj0pz8tj3mehzAUeAsi7FRHPcE4GQd2Kg342mp5JWk0Gjg+PgZQXqeGcUB38zmK580sVvY+YIBWL88UVDdy6sZYvfPYXAWeVFGXcsuycnV2SDHIrKLjknM8TeVvTdNkbKC1BNgiIwNlQznSptX8YFJ/0+xLTGNl76j2qcrzrr4/XRtFkdQBdWa/qFxqBSc7Wl3ybNtGkiQyr/Lw8FAUR+UcruvKc4pKTR+hatVlbkQYhnJ2bNQzjwSEslitJrTMNUfLulqHM/QCWCXeCd/3sfAF0X3RA0DmzcnJSc5DQYO12WzmlaVWz0VNOQPCxTL3bmoVZvpNtTaLorZBFfVaahd5kGQxr0oLHDHsdhcHCx1CFzUECr2bWkFC9Zyo76S+N3mQaEBQm3PZW5mDAcDaQXOWXGoFXyeTyQS7u7uYTCa4f/8+dnZ2JKxznaxb5tYt/WROrFv6u92urCBRlE7vtElQ9Aac186yttLf/YWiMIoJcRHvx0XMmHV/PxkNTyV4n9fes+7d7XZz5tB5Xh3CqjyOXGoFp6COuuTR7ziOUalUcP36dVQqFXz+858XENYMOFQE8BdJ7jkDgqYB3xfMtFaWyKCaH8J0YfJaTdNynhYSdbaKOxYmbIVLyW0WFfOAVprlMj8jk0//MJyCZaVW6krqnacJ84VxoDaPUAtFO9qKx0YVr7BBVd9FbZf6PnR/q6LJ5x7FANrXcMIBtSsp3c22bdRqtdy70G/V9FCfwxiTCRVqAIv6k0L9dPwi5cqLcskVXFuxxWYvR7BXXdehaRpM08RnPvMZ/NAP/RB+6Zd+CR/+8IcBnA4ulNmtgFgOwzDEMo4wGg7htG1UONCqW0gYENdWJkLKIO1TtvShc7HtUk2IekNcp2dLfDBfDRYyD1QOxWazmfM2UJlyVtNQazagc2DpivM5A7zEB9c1aDyLMmbemGIQis6fxCtI8HAosLi2bWMZi3A7AxDM5tIG5xqT94eSY7Juo9tsNuWzVe4aVdT6pSk0cKaB8RTqpjWOY+kto31TMaDzgVNwQNhstm2f4kUZjUbQNA337t3DrVu38MUvfhEvvPDCY9+fOjWKIvR6PZHKVoukHa1KMfDibORpxTgD+kkAHasZl2zOnGeiYIeWncM4kCxDpFycT+aQIMI/jVws2rll5gI9pzgzUh8AIjWQAlHvhmhIAb5SbGoTAcoAoexltZge1/4GLrmCc87BmMAaL5dLyW40Go3ksre1tYVKpSKTWVXvgdohNBuUBRRIGo0GoiRGVGPwFRBbMRhEmJMJ8orGALSVJJU0TXPLrirU/uJKQ7/bS8DSVzOWvD5ctVmzrFK+sKJHhXSVMWFuRcsQdqzBXABtx8aoHmEe+BJ7s6Nlz6pDBptqJsD083mi1JgBiW3bmM1mYByozA7RcWzM5j4Se0+aLOrsXzSZSCiJ+QMT6GGMSVssTGL0T8QSG/MUg+EAtm1j//4DfPKTn5T45PNq0LiuK4NEU3+OakMs04v56oOoFZNngY+6ZWHieUjCKPcBVagtSaMuyoanQKnHoii+70u7W31ubuAp9zyrUgVd02qsnhsrjp4oikSSARd9SwkJ1ZoBL5hnKw+ThbpUXs157MuBUmtYssRIEq7MD7XNRThxs9kUcORlBbUKg+HY8CrkGevA8wS6sswDppomzWaztGT5OrnUCl5RKh0bmo7xQMBh6/U6ru7swrZtjAZDfOlLX5LY7/Ok1+utMkd4/rjqKqPfm92eDAglKD9fFdV0uWhgQo2Oki3c6/VyWe8JWz13Hb0xLesyYeGM4FCz2QSyEjF6ylE3TFF7s9Ve6x0q3h+4WJ+o/dztbSBJYvDc0pOi1+utDeS9HbnUCg4IpF7/6BjP93ZwdCBmbSMQQPyDOwdo99pYLBZyVJOXgCqKFcP1ywz/wDjQDlebJzdd+XMl8U22ZMdzHz1mYGIZp84BIPnKgYzijAfCdCkhHipKrVaTbScSHQAYDAZymY47FqKauJe/WA0Cerdim7zaagYtWq2apsFp2+DDidzQtut1tKu2vBY1S5pePEnheR6qLcEKyzhgx5riZTJy3hLVW1X01ADA4cjHxoZgza5lkGZAOA/IS1bcTJataheVS63gacqxtbuDo4NDaGDY7m0gBTCdTME5Fx6QjCIZgCxGBQBWq4m572MZr8wKWqKLQky00hyKIqU2vNIeZdIhiCjjgB4qWGwGVBsW9Mx0ITOmmOam2t2qkNK16haGgyFato2kbqDWsEQVNx1yMKmBj2C+Mm887pduyGaBj4SnGLljdFkFvV4PjEMGuEgStspi1TQNnU4Hza61YphVvDqJCVlDR30mkQHRu5IiF/dGJPTdyONC16qk+B+4TSaDcLcxDkHWky399x7ch+M4aLSaCAskkuoytw4HTR82fLQ6V0+F0uqpeCZwevbV0/MxIYyv2kxSdk3Zcq9Kkpk6tm1jHk7kvYnCrCjdDWEecAb0nDLS+JWpQG7FaBmeuhfjyHmBim1mHNCVMunqu6gKqEaA15l/ZfcH8p6ldedcVC61guscuPfHX0DbsfGwMcVsnM1uz11FEIa4H4xhsdMbEunZWJzGmRC/x8TzoMZA2kugpVtgswh1rHgNG42G9GWrHhKvVh4QsQCAXO71PPaDpBhyLluCQ7sGzoAhD9FaiIqY9NzUqOVYXuU70uawxAtBMN1gngVQlmFuFZFeHSWYRe3iTEBog0CYXo0MZkwzuJq/SkJhe0pqpvvTCgVAxgDIbUltLvISqnJycvLeeVEYYz8K4Ecg0B1/BsEYuwPglyHKs38ewF/lnIeMsSqAXwLwTQBOAHwf5/z+WfdfZB1K2Sybm5tiY5nxhe/t7WF/XxSNUBNcAeEt6diOaKcyGxFehXGgVskveSeDoUy3IttW/SCq6LqOhLJZJj4a9dOmiGVZOcU+F5ClKBRqhvjo2SCje3uJL5kA7IolcTVqIEaNuLYcG9WKIYNTjbqFNBQmGHlLXM/Dzo6wi4O5L49HYYSqYSDByjzTIAbVci68OvVrKxNCHaCGYeTMi3UeJQroqGH4IAhKczTVeqgXlbdTo2cPwH8C4BOc849BrGzfD+BvAfg7nPNbAMYAfji75IcBjDnnzwH4O9l5Z4peqaC70UN3o5dbmlQatydZynq9Xunf1x0vk41uT5oidA0pmHqf8+75brWTzikGpzgT5g9ngkGAMxFLUM+h4+q5Gl8xB5CnqLP5eObCRdrb6/Vw8+bN8y+4oLxdE6UCoM4YiyBW50cA/gKAv5L9/RcB/NcQFdW+J/sNiGoQP8cYY/wMYhZe0RD3GojtBupZKQvGGDRNk+AlQqTRqPZ9H07bRhJGmE2nWbKwhmZbzAj1el14A0qe12g0EMdxbiZai2A7mWEbNQF/BSvNDFITBmq1WilcYJ09GkWRjCi2sKokFy1EexiQ28DqTRMVU3gfptOpXOLJI1FMiKbNHONAPQRAx7srfzpqhnzGlcyjAgZ4NhBrqx4sQ3AWRYXFlh1XgztpmpZieN7TUD3n/JAx9t9BkNwHAH4bgqDM5ZzTFKsWmpJFqDjnMWPMA9BDnqwMjLG/DuCvA8DG9hbCMBTZMLWaJMIxDEPw7CEP3kkZJEGkNx7AYBp621uo7PVw+/ZtcU4GDmIc2LasnPlS5oYq+yBA3vxQsRbrBoTqPZjP57LddD916aU2TQMf3bYNhJGMKApOkzxXF+PinnooPidNBFlfSwyKKrVG3rzRMz9/MPdhZdiVlAEz30enbYMtI7gnI7RsG5q26hPXdeE4TkbG5Oc8VsU+KXpIVPCcitunQlnUJ+uSvS8iT6zgWYHX7wFwA4AL4J9A1MIsiowUn/G31QHOfx7AzwPACx/7KL9x4wZOTk4wHo9zHhIVQ0IyHp5gaQm7fWejB6tWx3B0gpDlSR7fjpzn/biImKYp270uwFHmjZHHUe7lUDElZNMahlFqzhSTqpPs/71eT8Jxy8yStmNjvlzhgnq9Xi4L/yL98k704UXl7Zgo/yqAe5zzAQAwxn4NwLdC1L+sZLO4WmiKilAdMMYqAGwA5xZjPDo6kvV01KwTUhAV73Hjxg3Z2eP5HAfeMaADLCtHSOdTsjDN5DRTlJkZQN7LoWaX0DlF4ncZ5p/NSv3uuq5LcD/REtO1hKXZYhYCxoFpmCs9XskYpTzPQ5LVd287Nna3NjHzxYZ4uVxKbIfjOLJ9x8fHKxxL1i7ywBDGo6qxVTJ1rMHWLGAWIeqKdxohT2O9WCzk/eM4Lp3Bi+xUuVVX+Vuxz4vf5L1OeHgLwDczxiwIE+U7AHwWwB8A+F4IT8oPIl+E6gcBfCb7+++fZX8DYtmdTCbwPA+apslwvNopmqZJBTg6OsotbcSylCQJKpUK+v0+Yp4CeobHiIQnIQ4j+IGfsxPXKXuZqAEmVTY2NkoLqqpLrooNp4Fs2zY0TZOR2DAMVzBaxiRVHXVfHEYYnAxWJtAigJEV0XVdF/2+oGmzWk1YrdPLPdHSaZomIMFZNlNjAQkJLlampGcNh0OpyLopPC4M+UG/Dh+k9oWqvGUBMZLH8aAAb88Gf5kx9qsQrsAYwCsQpsW/APDLjLGfzo79QnbJLwD43xhjdyBm7u+/yHOovAV9/MeRw8NDAKKzkySRNG7A6aAJYTzKoLllcNaLiOd555oHRVHhwbPZDLquS+o2QMBZqX2qElGginGBn1EBSbu7uwBEJpQarCpicdR3p/4h06XYRjVwo2JmLptcanbZ67c+xP/9n/jPAUAyW9HyTLP4YrHI4RnUXER1ZgROY6ij7orbJD4eY6MrlDFJEnmfYpKsem9VypZmVWijTNcW20bX6rousB9rkgfWSZqmmM5ncNoCmkqrWtJtYDKbClzNZCF93KpMqkDCV2aJzB46g66C7i9XFqVvi1R4Z83gZBpdBCGorqo/+lf+2tc+uyxRohG17/HxcY5DGhBmAHkJ5vN5jlGWbNuR5wKMQeeAvhRw0rZj42E0g2Ya0MiXnX1YnWlYzOYCBKCx3NJZZgOGYXgu14daUYGEAEYkdG2n05HPo3dZB0VVhRhrbzx7XbICDDL+RsYBJwtGlVXJlDBa8qisgSQQcC2OYzzzzDNYxhGqFdFuxleZUMMoymHwiYLPMIxcZlEZ/HU+n+f2HSSqx+micqkVHBCKsVwucfv2bbk5UaGxqtmwu7srOysIAvm3mmHKqCAAPHz4EDN/jhGLsL1z5ZRHwqiaiJIYOoRJcN7Sq3oS3k+hwX/gHYqCt0wkEvRMgSHhGX/LWS1dZ5ask2IgqT/KGH4322u9JXR8Xd0l1Rv0duVSK7imaYizMhdqgdLBYLBC3bVacrMVBAGiKILneeh0OtInvjgcwMo+hO/7giJ4NkfXshAdiJklBmQR0xMtAm+JIEhlEWCpoBVJ1FlJVW4VoE98I/P5fC0EVBV1hi/uN9adT5vSSJkx583VZ/X9eVbbSFAUkwnR6XSwv78v2h9F0BRMiwq1LZpitm1LVl6qGk3nT5gPP+GSLFWle1DD9irXDZli6vs2Gg25Qi8Wi1Pv/oEh39Q1XVYins/nucq7ZTUekySR8M6UCftu4nrY4Kb0BhiGAc/zZD0aqknTbdtYhhFSAAtb4EA6bRsNw5RgK3VpVBOHVeUlDAuZVcPhUHJulylpnOE9UuSDQUW7tcxmp/PV1QnI41JSBnBdQ6PdgqXY3+PxWJoHxUDKOnOIjhM/eTExmEwp6t8yRl+1IoR67Ww2k89STb6im/Bxo5lPjEV5LyRVklOLm65arXaKCkIVsqt7vV4OU1EUOidZg7ugZf+iS7bqNVmXaKzKWW17HCGPUFr4opsZZqZIG/e4sNOLyuPgeYrXvRtyqWdwzrksjjSbzaRZUoZTIKFZI01TuZnxjVRuolrMgOM48p6EP4k7lvQkVF0fFtPQriI3w6klr4sbP5IyEks6Tu1Xl+CgacDPoLldfv7stO65VFfItm3Ms1WEIL47WkYhUWhn2YqyLoB1USHzY7lclqL/VEqIi2ycVVHZzS4ql1rBNU3DbDaTdWNU11QQBNjd3ZV+bZJiEAgQgQsOyCybSqWCSqWCD924KUk7290u9g8PhFIwTcJK1Ykv8H0wCCUK4/LIJ8Fm6T+pLFVTovZOjvuiHiWAJFuYNAh4ahxm5oYyo6tYDlVZ9Oz+KQDURSbRMo6EWQIR0o/DCGYGl42iCJppnMJMqLN7mmUksZLjCUPuOBWJKhsIagAHKDd1isqvBtpUk8yyLPmsMr6Us+RSK3gSrzZvvV5PduR8PpcFjy4iaiaLKgcPD2HWqjDqVRmUoUwf8iaoQmbAeRk6Kty0s5l5MDiX5o5eNaUbrqxtFzVXKOsHACpV5DAkdE+1veQCPEvWse1qHNjqPlnAa52cnJyg3W6/I/daJ5dawZm2ygRR66lbloVerycDPmcFEigAESi0EJqmgeka2BVRBc1smYiXS4yzkHbDbmC+XKDt2KhUKpKSYpFmFdt4lEsoVmniKGl3iAhRGsHISoto4znazdaKMo6tTAiZZcPLZ6biJo2WaNdI4S2zBGcPsLP22JoIsnANGFcS6LowvbqxgWB0erOadBuY+fNTwZqpucpsEhlSIiWujG/mPCkzq4pZO8X8SxUC/STmEnDJFRwoz8wGVrNImbcBgEzSBQCzYmA099GxbSyjCPVqDVGwRGqJMnXj8RhRFEnbfLlcYn80ErO4kj6VshXenC2jVVZLw5Kgp5RF0n1YNQyZjdOsWBj2B2JG7TZy92nVLTTqFsahK5+legzU2Z3MDUAQ8WxsbGDierAqhhzEagKyWdGkklIgJg4jWFmbOQP6w4F8Tj010G0LSO40WSmlCqlVvTS6aZwKGgHrV4K0MEA4Y0iSBDxOckUK1O+pmjSPq+iXXsEfVxxHpKkVmUgdx0E7m7nUv9H5g8EArutKsL3jONKNRq6/4kdrZ9cuo9X9NA45UILZHK7rCijAkosCWgw4KRQJIQVxHCdHA6EKZ6dNrLP6IAxPJxSrzyqeD2T3H81Lz1l3LSDeOb2gWfUk51P7ngRW8jWl4Gq4t2wHrporarRzlqbQm22MGcdgOpalUMLxOIebppKEnHPJ+qRWYqNZHgC8OAIQSv6TZrOJNE5gp0CaarCXGoYZ2yrjwDONDg7e2hccLIEHo2pi7LmIs9zDaTRFY5HKDSCF6wHgMF75/wHA5Znff5oILI7VgHc0gpmFzA/TOYy6+G2aJlzXFRgetsLk1BS73J/NZTaQ0bXwMPIhqauQ5YKWeGQZB5xl+cArnk/9EB+PYSuJ4rVaFd7Ew8KulpoxT2IOqfI1peBl2R/ASvEdx5E1MNXdvVqheHNzU3pmAJHC5nkeGGOoZhwrJycnuHHjBoB8pPTw8FAOiHqzgZbVyJJ55whmM7RsG+5sJopkcTHYKPvm4OBADj7bttHIYKvHwwE2NzcxdT00uSEDUjxZuSQXbCGjuJqmyc31LBCFqqbTKSphhGrGZWgYhvR4jDwXVuZd0bAysTzXQxwKe77ZXrkGz1KidVwuJIwroLN63lykDxDMfYyjBC3bRsUUk4pZq2LJ334soEy+phT8LPPDtm2ZxvY496vX69A0TaZeASIJV70XKbjjOLlMIjI/ejByZobrusKk2LLhuS40DnzI2cTEXZkfdP9ulvlPkip/p2epq1GSJPJaFbPhOE6O54Qpx88jjr9onaJ1/V+Us1h59/b2kEQCFUoJGu+mfE0pOOEVihvLSqUiXYfkZVDReyqkVqUXC8NQfizLsqQ3hOjdihkpaZrKMDSwiq56aYrUrGHJl6i4AZpWBlUdTLGtCyU8evhIconoRgV2x4HTtuG+uQ+eLNGFjkldsEwJL4cwrQCAJ1z6hVutlqwTv1gsMJkICraBCWiNjJJuka7MhiAE4fK82iqjqWYYMCsCkoBjHx3iXz8DIqsqNgXOVMvcrWfmE89XK6ZVl0wdPw0RaiG6DUvCINI0PZe99gPHD845z0XV6AXXRfOIjdYwxIcjO1rTNKmkvu/L4yrniRPwp58AACAASURBVOq18JcL1Op1NO02wmCBg4MDAGIgLRYLXLlyRcI+bdvGZD5D3axie2sbHB4mrncKksqw8mTwJMXR0ZHgIJ/7eO76DSQMOIimctlWKz9QsgYg9gS+76Pf7688JaYpYauMA4PjPlqNJjQANWtVuGmS+nLjTG3RAMR8xZHi8TyjgKpUOZMjw9EzDiznPpqODSCflaOaNHKyUGb3YO5LaG5RuYuBHvX5jyOXWsGB1bK4joCn7HzqGFrK1Y9EJkTZcZqhWq0WhsMheJoijWLZBqoENp1OsVwu5bNY5ura399HM0ihgZV6HCQTwJW8WXLn7l1BGNQSOZlXr16VlScAQfZPZpJpmqWmgmoG3LhxA3EYnTqnTNZ5RspknYmy7h7ntfOizy8zyS4ql1rBGWPSA6CGb9eNZEITTqdTJEmSi3QS9ngwGKBarcK2bYzH4xyCbTAYZDa1iZc+9BzciYdHiKXpEscx0jSV5cTH4zEmkwmSJJFtShUWqqKk1Yo0b9JUkGBWWyuzqgGBPycY7Gg0kkxbaoaRqjAqrwitUg+TOVgWTUV95XUpekVkO+sG5srMXcZDos6kKgDNqwG8WsdIT4B0NcuqWBd1D0H3CeMoV6u+KGqgh74dY+yDhSYE8i96Hg6BKJNVwFWapuj3+2i1Wmi1Wrh165YM7vi+j6OjI/HviYdGo4FGowGnbeONr76KR4cPEUWRPE4+cgIKpWmKGzduYHNzU/4HAPuHB0jTVOKmyetD5kGSJNja2sLW1hZ2d3dlCcQTd4z5cgF/uchBYekd+v0+oIvE4JQJU4F+LxYLVCoVacqk4Of6jefB6Qgh8b0UWWBpgilOLikDZosAk/ks922Im9D3fYljKfN9nxelJJix2u+PY6pc6hn8cWWdx0A1S1QcheM4csYvjvR2FpQZYP0SX61Wsb+/jzRN5fLpOA5msxk6nU4p4Q4Jtaff70uft9PrylSz0WiUgwOT29KoVeGejJAy5Dw9juMIs0rx+ABYGzh6J6WTPSuYrTcj3wUP4IXkUit4MUx/FuYEEEunCqekpZYSDsi7AuQ/PM0gsoTfdIrFUmTKIFpPY5CmKVqtFjRNk9kxlEhA9yd8hZqsoVJCNJtNQY/heuB9D8lchPw1pbYkzeCMA+2IodMgj5AJMBOYRPBqSkSSsbXpYCRUWpE8RiSE2iu+a1EoWduJNbBAuCfj6unEBsYBc7SqNBc0T68YjxPAeS95Ud4TeZzdNHUUJfOqaVDUkcRDUq1WT3ljaCOrmgfF+6tVFQzDyMF1vYylVQUJHR0dYWtrC0mSyOsNw0C/38dkMkGj3cJWbwPdbhfLg4FksypGapvNJpy2jcm9QzlYGIc0i6LayuPU7/elW3RdRkwRknoeztqyLNk/XGOnk5RxGqNStaxT5RTNilFKmF+UskllnffsLLn0Cv5uihpMeRKhGRNY7fBd15UrgeM4qNVqEo2oyosvvghAhPi//OUvC6AT8rgUkn6/D8YYeJKi5ziSK5xxyKCSu+CyDTdu3JCDbJ0XpdvtPrayrDN71nlC3i+zRJVLreCc8xytGclFcvPO+ng0u6lmQ5Eskn6rrLCEV6lWq2g2m7nAUxiGsG0BryXTKAxDSW0WRVGOpvjVV19FpVIBY0wOCC+OkJo16I0KJoMBarUaKpWKVMaNjQ30YOLhgSA0mjcrgCM8Rdc2N3H//v0z+yRNU8lDQnVG1XKDtKEdj8fyXUiKJhZwAYxKVholNgzBxMVytWUv9B2LrGEfKBNFLSOopjitY3xVpZhBoroY1evVLCE6h2z5snu+9dZboLLV9KGJzpkIe4i8nTLqqc2SQs2ypPKEYSgTqy3LwnQ6xe7uLrZ2rmBzawuDfh8P7t4TOPSTE0ynSzx77RkAwINoIoNNt2/fLk0eUN8duoZ6rYkoTdDM+kfFstO7bGxsiEHguRJzRYPN8zyRkJ1tjIfD4QrspmQSEbhKNVuKrtNlvMow0nj5d3xSHDjJpVbwi4q6nD8uHqUs6NPpdNYu8RTcUV1w4/EYL7zwAhhjCIJA3pNznlvWL4LlIM9MAo579+6h1WpJ6C7jwP5bX0USiXnQuLoh2/PM3tXSGZzwM6SwpGOqeaZ6mehvaZoCGsudryYkqPdX36dolpTFA6gfUnZ+IOrtyqVWcOLcOG+XXdZJ60yU4oygJsaqaEUVRquWIiT8igrZNQwDd+7cAYAcYpAy/z3Pk2T9gPARN5tNuaJQthKZM3arDWOyQM1qg6fAcRzgzp07cNo2Njc3JSwW3hKVOEbk9vEq25eIQ3XpPzo6QrVaxeC4j02thrZpwZ14CJqrvQcFvwAxU29uboqN7v6xrAE0azZzbs979+5hZ2dHDhLGgcYsQkUTAak5Vsy6xFTVdmzMAw8IBKLRmkdoZDP8UZLfVBc3lo9buoTkUis4mShnyTq+ERW7QvcoJsmqOO91XIO+7+c+bBkXCnAaAOZ5HjzPkybQ3t6ePMf3fdy7dw+2bePq1atot9vwPA/LOJIRVTtk0BpioKRLwRYbLBcwF4DnC8/NxtYmms2mAHDN85nrJE6vK4I3HGgvBG6kqhsocnWRbT4cDjEcDsE4cLVuw6wIkNRwPpZ7C+JuJJZbIBvQlQgng2Gu/4AVhTNNIsSdUtct6YE5i57ucV2JqlxqBX8vhJbLMvL4d1JOTk6k4pmmievXr0u//P3792XSc9txBMlQyHAyGCIFhzsfYfPKNjQO2AtgYVaF58R1sVwuhRmwxlTVMk+LxgG+AKqGeSbuWs3ucY/HUsGdTUdi2IfDocTdFz1RF4XUkjwOFuZJ5FwFZ4x9CsB3A+hnxabAGOsC+BUA1wHcB/CXOOdjJhIK/y6A7wLgA/j3OOefz675QQD/ZXbbn+ac/+JFGqhSBpTJuuNJkuRm6jKm03UsTpVKJVc/npbIJElyqMSLSBAE0lxR8STE80I1Iff29hAEgeQTv+e66PV6MFsmPtZ8BlNXsJrcT31oGb/5ta2VuaIZqcRX07tTsrDNhQKOmyn2R1m+qFaV70XsYMvlUlY4Y1zsRZbBQiQgz+e4e/8eNjY20Gq1pEeo0WggiiJx7dhDzRSmTrPZzMGMoyhCxVzlk67zwADrPVpPIheZwf9XAD8HUQKQ5McB/B7n/GcYYz+e/fu/gChhciv7789BFJ/6c9mA+K8AfAJio/05xtg/45znSU3KGlipiKRUzuXOXUUWruP88zwvF+pWKZaLJkqZqM9Yt0TO53PYtp2bwVTF39jYwGAwwGg0AmNMJhSHYSjpz6IokjiT7e1tObAqVRPVioHlconBeLzCd9crmM4DdOwWomWI2cgVlHTPbK6o0mpVJOEqPY0gqeQhAVY4nfF4LBKjGYOu66g3G6KIFQf80Rw7m1tIGHBld1vO4ISmpPtQYrXd6chSjP1+H0EQ4JlnnkFF07EMFojDCGE7X4uHcDmMsdy3U23wIlXz48i5Cs45/0PG2PXC4e8B8O3Z718E8GkIBf8eAL+UVW74Y8aYwxjbyc79Hc75CAAYY78D4DsB/KPznk9AKcotBJ7MdVRWtOrdENUjoWYJMcZKcSGO48gP+/DhQ+mdUemDHceBNxYBHQ2A47Th2DYwmknMzEPXlf0yGbu568+DsxK0WNd1tNttUSyXAxv2FvwMX3L37t2ciUXXNptNHB8fy8Tqs6RoGjmOA13XMZvNcgSmjLGcqfN2vvuT2uDbnPNHAMA5f8QYowiGrKSWCVVZW3f8lKhV1jobPQHmXy7huq70L8dxnNuwqYxIJMWws2maOdLNMp94mZxVyoRo34IgkDYnmSKSfmJ/XwaIqIJEvV6XsFdKXqBrqezKdDqVS/xXTw7R7XbR63TxXD1E4M8BPsWfRRNUMvNDXUVo0woA/SCQvOFQaDdU2K2mabLIbhAEMqjz+nwEXdfR6/ZQmyWybbPZTHqEKNfUadtw6jrm05ncfFL5mXSzBVbL+NOxChoFWdsMw0C9XpcmnNqfmqYhSZJTWVoXlXd6k1k2PfIzjp8+qFRZ2332Gid7WM3KKXos1nk2VKFIoOoOLP5dxWOoHpjzomeqZ2a5XMoqDQCkUgBic0bYFcKQUFSUnvXgwQP5d5XLcDAY4KVv+gTc+1/A9etX8drrb6LX6WLsTQBoucoWBA8gMFdZoScBtWVwbBsP7t5DtVoV2JhGQ04klAIYBAF0XZdtU6XWsDAaDFHRdCSzCFc2NpFCwHWptifAJP6kUjVRbzXBADnQAbF6qX52+haEKyKTiCoyX1SeVMGPGWM72ey9A6CfHadKaiRUZe0AK5OGjn/6vIe8k0To75ScF1RyHKeUMF81V9RryacO5Jd+VzE5AOCFF15QlFhb3bMjUIfqgL1osMtzXfA0heM40g+uZkKFYYi9vb1T7VfvTzwwTttGvRJhlP0tBS/1rswCX8526qBU++YsuXv37oXOI3lSBaeKaT+D05XU/mPG2C9DbDK9bBD8FoD/NqutCQD/OoCfOO8hKuSTeL2BPD5B9Z+qs636m0wTIq9U4bFq0vFF2Fbp/OLMTseJgoKujeMY7XYbYRjKpZk+fJHJSVXSIhf5vXv3MJ/OsFft4itfHIKjg729GrzpBNPpFPP5HO12W3hAGEOr1RLFYXU9d3/yrnQCoMnr4JMIQz3CbDaT18qNbqWCo6MjAJCwYMKoqOYa5xxjz8W0aiJqMHTaNozRHOGS+oqjEi7RbrawFRtAyAXWXlu5EuM4zmFfaJVVj9E3exy5iJvwH0HMvhuMsQMIb8jPAPjHjLEfhign+O9kp/8mhIvwDoSb8IeyDhgxxn4KwJ9m5/1N2nCeJZxz1Go1jEajU1wo60TteMJpkLcDyG9UVMxJrWFJW2oxXx8FVWnEkiRBo9GAN5vCqNfg2DaixVK6Bh8+fIjhcIjZbIa9vT2p2PV6Hfv7+zKAVJYErQaXag0L1WoV8/kci9TAdDxC07Fx+Ogh4jjG1tYWNjc34fu+HCTkbiSFsG0b/nIB0zQxODoGmhZ6nQ5SAEE6l7WQqJo0IJSaTKy33npL8sYUWW4bjQZs28ZgMIBpGPBnc7SwmpUbXQuD8QjNdgvjowdIoljAlXtNVOvC0zUYDHJmCYm6t3pXko455395zZ++o+RcDuA/WnOfTwH41GM1Tn/yLYLjOLJDVJaos+Rx/CvqphcQyz04lwqeZks/heT7/f6pJGf1XsDpJGiSMAzlhmU6naLtOGg7Nt469rC1tYXpdArOy02CwWCwIkDi4l7Xrl0DxgFGBLVNhIJTm9XnkklQqVRyXhcK9FD7z9r8ue4KA3Pjxg1sdHs4PDzEYThda+aRjMfjnAn3uHKpI5k0w9LsTQo7Go0keg9YLedhGMpOmM/nOajtOjwDod4qJz4adcFb4hXCxurms9FoSJfWcrlEuFiiMvaxVTHQjioYmlyG/slUIV/zw4cPTyVNm6aZ88vTB6dcUGo/nTOOI5wkU8H2moG7CHZLZlIcx6fMoDiM0JwnWAYLGEsNfSOW9G6blU15bb/fh67r0jUbxzGazSYmkwnu3LkjZ9RarSbr/oRhKGt5UjmVRsMB0gwluQwFHufuIwSaiNBS9FVNwKCCt2o+aKfTwWAwQLvdPmUaXUQutYITFntvb0/ygdi2jd1rVzH3fbQcO0dDYJqm7JjxxMM08OHYNpIwkgNlGUeoW4LgfeqKoI/TtsEhtm5nVSCjpOZGoyG4U0wTTttGrRZiPBiKAde1pGIT/gKAtIUJvEUfqlKpnMqtBFbV5YB8hnqj0QDnHPEyFGH6zG9uWVZucNM9J/MZdra2wSCUZRQNYJomqjqTfqxHjx7h2WeflX1IEF4Clo1GI9y4cQP9fh+2bePk5EQOAtd15UY0SgW7gNO2gZQjmPtYzn30Njfzs//xMa5c3cMYgfSu6HxVBlFlKfB9H51OR6YDPu4sfqkVPIzK8QxnZeJIZVGgnkVZd/xxPKyE8eBJip1KozRJWc3uAcqhtnQcyAc16vW6PF6tVuUMSzQagFBYmgGLjLnkFdnc3MTDhw8F4aYermWXVT0nRaAUILwXRJuhSqfTkdcW3beq14XeOYqiXBsoYXkydqU5pEaHi8nUjyuXWsEJTXj79m10uwIVF4cRmpMIZkVExk4qeU+LaZrC5BiLHMC2CZxokCUF2wFH1RfXzrgyY/YsjH0fdtuG7+YjjmTqRFEky2vTTAwA95audA22rJVCq8o9nU7lfdRqD/P5XO4R6KNSUgHdUzU3yLPgeZ6s/ExtU/EbtHIwxuQmdhaFiCJAaxsIx3N5f8dxZNJFrVbD/r6IyammTrPZlEqmaRoODg5kXVLaoFIh3pk/x6JqosZjQRXRYKhWRQDMdV1Ym10c8QDNaYSmJcBfc13Hs88+C8/zwDnHYrGQ5g/125OA4C61gsdxjEajgd3dXdy++ybipaAr3jWaqJmiDEijako+v/HEg24a0CCUcjn3EYcR/NSX/NptU0BHEwAV08j7dCHMFlVBVDeVWiOGsne2t7fhPfLQWUPeTrOhWoXZ932pnARRVa9R9xyU6UPwW3I9NhqN3L5kGUfoj07wwvPPI43iXJCIzllkydbNuoUkFDb+YrGA7/uYzWYYDAYIwxBXr16VJsFyuZRKRxFFwzDw/PPPyzar6ELqEzVwFkUR5hORl2qYBhZZArIFA7PJBLUM/0KrQ71ez0GZe73eqVpMF5VLreAAJPtUz+nIDWF9FmFw3BfYjO3VjrtrO1hEq6VchYYSvgLT8BQTbJmodG2q+06F1xJdW9FXq8p5GJji88vgpq7rylm+eFxdyk3TxGw2QxgsSqO6juPINqdpiuVyKfHoNGsbhiG9ItQWTdPkgKeZmtrtOE7O60H313U9Z0Z2MxqM/f39UpyM4zilwSrTNHF8fIxer3eqOO5F5FIruK7ruHr1qvSW0BK5qJtId0WnjseuKAdYt7DBTVjLzPzYaOAwm1U2s+JJnAHj+iqUXV2z4lFmDLWBch1938dkMpFwUdp0rrMPDcPIzdo0k9LsS6IGtNTAk1pJmHz6ZZAExoGGF6IWAW2zDq9TlxWQR6PRqaWdMDFU1WIwGKDT6eQgDKTI4/EYrVZrLWXDw4cPpcI2Gg1ZHIwCc2Ru9ft9XL16VcIuGo0GjqcT+Esf8KZoWQ0ZwEuSJNcnpmliMBhA13UJQbioXGoFp6x0AgGNRiPs7e1JV5Zt22h3HOlqc/uuhJV6HNjZ3QUgslgmE4GnbjQaiBZLbG9sypmmKHEcy4/pui5u3boFQGyofN+Xyz6lmDUajVxyca/XQ7/fz3G50D2Lm8wiHl31HtD5jDG0221wznMuOrvbAUu5eOelwHMPjvsYNxjiJEFve+sU/drt27cBiCDORz/6UfmOnHOp8GSGVKtV2d9AnqaaBtzu7q5ss7pJBpBz03qel9tAp2mK3e0rsowj9Qm9t+o1okGXJMkHq4ygZVnY3t7GwcHBWjNAdROSGcIZMFq6IvgCoGaYOTfVeYEJVdQgkeu68H3BSRjHsZxJXdeV3CetVktCfFXf9OOKGqhaJ5OxUEzGgQ2IxGLOAN4Q9UUP9veBJM2ZCsTHslgspNei2+2i3+/jypUr0itCRQGSJEGr1VqLdVmX0aOeZxhGzkRTaetI1OK45Kqkcx83PK/KpVbwJE5kkGM6naJWq+Hk5ARpmp4q/exOPLgAwiRGp23jqtYAYoF5GOupNHMsy5JLXNnsTUszQU5JiVUvASBms9FoJAMiXYVqjTah6ocioXuqWBr5DoqyuK4r8THqjB/HsQzDq4Erl3McDx/i2u4eOgFwtbkl8R50ved5GI/HuHr1KhaLBXazFY6CK/1+H/V6XfraVVNgPp9LJd3Y2EClUpEUGzSzq6ZdGIZyI805l/2vYr1VE244HOYGRxkE+knkcit4muBLX/my/HcUrF5anUVISab+HMFigTBYYBlpktS91dko5TUsYzsdTzxsb2xKygeqynb//v3cTKWmwc3n81JauUqlklNwOqeMNg1Abrmne5HnhK5ljMmlfzgc5ma3dkNQS+hGBYePHora9Z0GUqwIOReLBZIkwXw+l2ZVtVrF888/j+FwCN/34bqu7F96ruM4Erz16NEjtNtt2VbTNNFqtXB4eChXPDXRe2NjQ+JVVFMFACaTCZ5//vnciqUC19QJYGNj44MVydQV/ANwmk217NjW1pZIsO17iJarZc6olgeG1JJ2ZYGJRqMhWWjVgVV87jpTpKyd65bdsxJ46fpi4GidPUolC0fImxaUxqf263Q6xeuvvw7HcXKcMPRsupZm006nk8vAobapnhf1Pc4yY+r1OqbT6Smvyzpv0gcqkqnHKbbCVROdShuYczzkK9ScyssRvPkQqNbQarVQqdURajqYrsHny1Mjn3GgswSMDNAVRRGqsZhVHzCG69evAwBee+01aYpEUYSNjQ14npdbmmnjqWJiAPFBCGxl27b0AhiGgTiOTzHAFj8e3YdwHvRbDeLQM/v9vmxPDabci1jKDB6GIabTKabTKZrNpjSV6vU6Hj16hPl8Ds65vL8KJ6bZV22L/C6KwqpV7jjn0HUdjuNIhlx1JS3SsqmuQVrhiApvPp8jDMPHLv99qRW8uBGk4M5mq4FFHIEBmPs+As9Fp23DrFVx/cYNUafmZCgIKzOUnd0QH+Hw6BGSUACCLG5is7cBDcDY82BmUbi+N0SqMWxvb+PatWvyQ9y/f18u6+pHIJODXFkUJq9UTQyGQyTgqGYFnwzDkOHnwWAgbWziRakYBhzbRrVi5AJApESHR4/QarczujMu4a2UAcQ4gBCy4NX+eIwoEQNJxZMcDweIwbEYDtCyVsEg2vMQXoYG4Ww2k4pNNHK7u7s4PDxEkiTY3t6WA5iEIqVpmkqvC7BK1ib3J92T9gTD4VB6jYgaTtf1U7P8ReRSK7hegMuqJfbqTbFUdxwHQfZxCPxD0u12BeXBbLTCS3CglXlbts3V+YwxiSf5+mc2MRqNcLC/jzBYyLQvUswyKcJMSTrOqupx2flhGEoTaBGFOaq0MvOs1WrlSgSqm9KyDdn169cxOBFtLuJJyp6lbmgdx5EbSzVLic7vdDqYz+cyuEMEpMV3JLeiepwGUJkZVuynt8NTc6kVPNGBUbbHoNlP48Dm1EQ8zDZpfog9ZsFhFuq2JZdIxhhms5mMZKrmwGw2w87ODuZVEwtWgzebYjKZ4NFoiWf2rgL7QzzTaoPbTVjfuIM7d+5gOBxC0zSJupvNZtLTonoMKpWKgK9yID12oYGB+y58XXhW2u22jMqRR8XzPDAOXDdt6EzD5JELs9fIfVgqraKP5jLD3jdWZlcRhut5HjgDFrEv9x+O46DVaona9tMIPFmg2W7hESK57BuGgf39fXDOcyAvXdfR7XZxeHgoEzZUpqt6vZ4rnFVkQVDzLaMoKp0oJpNJacYQvV9x03kRudwKHidYzIUiaxwYDoZw2qJCrmEYCDMzRc8mnShaldpmXCyFnufBt/PeD8MwEAQB/Az2udntYXtDLPFTbwLHqODB/lswa1XUjBSTyURu6CjxttVqCTrjXk8mP3ieh+PhAFrGqnqtYaPbtpEwYNh/Czdu3JBh7jRNRdCmYQFJCn82hzt1cW1nF4twCTOrlfPKK6/gxnMfAjJKt/osglWrod5q4nMHdyQBzyIKsfAzgJlurZ6rr3Ise1ubkv65t9lEvFjCm89gNI1cdhEp+3w+x87OjrS979+/LxMsaI8C5NMJqcDX8fFxzrNEZp7v+9I1qOJk6NtQcKwIPKPgzwfKi6Lpp+GXTtsGxvnl/izeD6Zr8JNy88A0Tdy7d09unGiJdxwHzz93C/uHB/jC3TdhNRunrlWzXVQfeNfO86IgFb541dygwQBkXpzseCdLIaNroygSuZAFXoKR68KKIzlg6D4q3oaydZwP7UkzQw0M6amB3Ss70EwDRkM/19Q5i8xfFRXHoqIVyzxg6zxARfPscengVLnUCl4MzRIAX2X8cutAalkIeYT6xJdcepMqkEYAaoDF8wylR0dHMvy/t7cnAxZURvBoHomaOQy4efMmoiTGYrHAYDAA5xxXr17NJedOp1M8ePBAektkub0mcN8XEAEt+77UBrJVB4OBhIbO2gZGoQ+0DZjZqtTtdmXZFdu2oV+zYWWb0mQ8lsqrcqmnV2zMsgE0KWBFyE6eBT7+9NGbwsvB2jkCf3XDSTN7FEWySpzrulLZCBtCcAWyy6Mokm1TN4bqbH+WrCPifFwlv9QKrmmaTOAllGCOlZQBy2CBar0m678QW6nqTqMZyfM8cE1wdLQ7IrBAmTZbO1fQ295Ct23Dmsd4cE8QYupXOpj58xy/oOu6mAU+ojjGdkY71m630W63EQSBhHZubGygZa0ScinDhwIqBOzf3d2F53kib9M0wQA066tlWm2/53nCjGg00dxuyhmVlv4oiuAPVh6LtJrmUHhU1WHqeiJeECfSdXn//n2Jt6GBSN4PGuDUZtpzMMakyUE1kK5du1YKG1bdj8B6KrYiTIFm/4tw1BTlUiu4rlfkklcMjNBSrgYc1ONFoWVuPPFyGT10nLJGWJJieDTG9evX4Xke9hde7lwK71eqpixBGC/DUwEYIEu2zZJ5i20psyXVDJ14WQ6XpX8DyCUyF91ndE7RZ0xBLEpyAETEdXNzUw6gYltpcJ9nnqhwXBUGsa5t68Lw6wI6T+JRudQKnqaJXPZp9LcdGxMuymnbbRtW2JCzzLiudFiY5/imXMGPdfcwq0zBZwmiZkse/4h9Ba9+5auI3BAjdwydaUh4iqs3rwpX43SK8XiMMAzRbrawq9XRbXdwMEvgb9oyrA5AVlSo1+uy3SoegwD9NKu99tprcNo2etNI5IcyYKjAZFRF4JznaCaKnC80c5NpcXx8LDEijUYD165dw2QyyZHTp2kq0ZaqXUwrDkVeyROiF8bDVwAABQVJREFUFrVVo7KNRgOVSgXVahWu60rPlWmauXzRsjQ7VaHJtGk2mxJ3Q0KeqIvKpVZwFSSkZtP4vo+trLP9MMopC0kC4do6Pj7GxsYGOOc4PDzEyI9l9nzYNCQFgm408OI3fRzHx8fYurItMtwnHu7evYuHR4+kfdrr9TBxPaQLD2+++Sbajo2FZuQ2gYTlsCxLQlspzQ1YfUDP87BcLtHr9cA4kCxTuBNh+wcm0NsU70jUbaTIRRwOvbdq/pDUajVpAj18+BC9Xk+6SSnoQ4kPx8fHOe6XyWSCGzdu4I033pCYEnoO2dLqrMr5qpSh6pYtDhqSIrhKFTJ9irztj4MFBy65gp8lalh3nRAHSBAEwrxgGmpmJDEqgOJ5mEe4ffs2LMuS5I/uxMsVOycknAaGq3Ubh/sHaDs2jqL1QZx1ombPUxuebXbhjsZixfDdc5fy8+4NCFis67rwPE9ymxCmhsyP4+NjvP766xLiq8rx8TFardYpU7DseY9bhUEdqGVmTJqmb5sNmD1ptvJ7IYyxKYDX3+92lMgGgPV1ut8fuYxtAt69dj3LOd8876TLPoO/zjn/xPvdiKIwxj572dp1GdsEvP/tOrv4+1N5Kl/j8lTBn8oHWi67gv/8+92ANXIZ23UZ2wS8z+261JvMp/JU3q5c9hn8qTyVtyVPFfypfKDl0io4Y+w7GWOvM8buZLU436vnXmOM/QFj7FXG2FcYY/9pdrzLGPsdxtjt7P+d7DhjjP0PWTu/xBj7+LvYNp0x9gpj7Deyf99gjL2ctelXGGNmdrya/ftO9vfr72KbHMbYrzLGXsv67FsuQ19J4Zxfuv8A6ADeBHATgAngiwA++h49ewfAx7PfLQBvAPgogL8N4Mez4z8O4G9lv78LwP8NEaz/ZgAvv4tt+88A/B8AfiP79z8G8P3Z738A4D/Ifv+HAP5B9vv7AfzKu9imXwTwI9lvE4BzGfpKtu+9UJon6LRvAfBbyr9/AsBPvE9t+acA/jWIiOpOdmwHIggFAP8QwF9WzpfnvcPtuArg9wD8BQC/kSnJEECl2GcAfgvAt2S/K9l57F1oUxvAveK93+++Uv+7rCbKhQvHvpuSLe0vAngZheK3AM4rfvtOy88C+DGsEME9AC7nnFBN6nNlm7K/e9n577TcBDAA8L9kptP/zBhr4P3vKymXVcEvXDj2XWsAY00A/yeAv8E5n5x1asmxd7StjLHvBtDnnH/ugs99r/qvAuDjAP5HzvmLAOYQJsk6ec+/62VV8HUFZd8TYYwZEMr9v3POfy07fJwVvcUFi9++k/JtAP5Nxth9AL8MYab8LACHMUZ4IvW5sk3Z320A55ZtfAI5AHDAOX85+/evQij8+9lXObmsCv6nAG5lXgITYqP0z96LBzOBz/wFAK9yzv975U9U/BY4Xfz2BzIPwTcjK377TraJc/4TnPOrnPPrEH3x+5zzfxfAHwD43jVtorZ+b3b+Oz5Tcs6PAOwzxl7IDn0HgK/ifeyrskZeyv8gdtxvQHhTfvI9fO6fh1g2vwTgC9l/3wVhw/4egNvZ/7vZ+QzA38va+WcAPvEut+/bsfKi3ATwJxCFd/8JgGp2vJb9+07295vvYnu+EcBns/76dQCdy9JXnPOnofqn8sGWy2qiPJWn8o7IUwV/Kh9oeargT+UDLU8V/Kl8oOWpgj+VD7Q8VfCn8oGWpwr+VD7Q8v8BB1WcKVYHVdcAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "plt.imshow(input[:,:,::-1])\n",
    "plt.rcParams['figure.figsize']=(15, 14)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Spatial Transformer Networks \n",
    "\n",
    "The spatial transformer network is a type of a visual attention mechanism. It allows a neural network to learn how to perform spatial transformations on the input image in order to enhance the geometric invariance of the model. Please refer to [Spatial Transformer Networks](https://arxiv.org/abs/1506.02025) for detailed information "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.Size([1, 3, 24, 94])\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def convert_image(inp):\n",
    "    # convert a Tensor to numpy image\n",
    "    inp = inp.squeeze(0).cpu()\n",
    "    inp = inp.detach().numpy().transpose((1,2,0))\n",
    "    inp = 127.5 + inp/0.0078125\n",
    "    inp = inp.astype('uint8') \n",
    "\n",
    "    return inp\n",
    "\n",
    "STN = STNet()\n",
    "STN.to(device)\n",
    "STN.load_state_dict(torch.load('LPRNet/weights/Final_STN_model.pth', map_location=lambda storage, loc: storage))\n",
    "STN.eval()\n",
    "\n",
    "bbox = bboxes[0, :4]\n",
    "x1, y1, x2, y2 = [int(bbox[j]) for j in range(4)]      \n",
    "w = int(x2 - x1 + 1.0)\n",
    "h = int(y2 - y1 + 1.0)\n",
    "img_box = np.zeros((h, w, 3))\n",
    "img_box = image[y1:y2+1, x1:x2+1, :]\n",
    "im = cv2.resize(img_box, (94, 24), interpolation=cv2.INTER_CUBIC)\n",
    "im = (np.transpose(np.float32(im), (2, 0, 1)) - 127.5)*0.0078125\n",
    "data = torch.from_numpy(im).float().unsqueeze(0).to(device)  # torch.Size([1, 3, 24, 94]) \n",
    "transfer = STN(data)\n",
    "print(transfer.shape)\n",
    "transformed_img = convert_image(transfer)\n",
    "\n",
    "plt.imshow(transformed_img[:,:,::-1])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## LPRNet architecture \n",
    "\n",
    "The basic building block of the model backbone was inspired by SqueezeNet Fire Blocks and Inception Blocks. The input image size is set as 94x24 pixels RGB image. The image is preprocessed by the Spatial Transformer Layer to allow better characteristics. The converted RGB image goes through the backbone and the intermediate feature maps from backbone subnet outputs are utiltized to capture important characteristics instead of using LSTM. The intermediate feature maps are augmented with the global context embedding and concatenated together. In order to adjust the depth of feature map to the character class number, additional 1x1 convolution is applied. The model output and the target character sequence lengths are of different length. Here we use length of 18 as output, for each output character, there are 68 different classes resulting from the CHARS. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "import torch.nn as nn\n",
    "import torch\n",
    "\n",
    "class small_basic_block(nn.Module):\n",
    "    def __init__(self, ch_in, ch_out):\n",
    "        super(small_basic_block, self).__init__()\n",
    "        self.block = nn.Sequential(\n",
    "            nn.Conv2d(ch_in, ch_out // 4, kernel_size=1),\n",
    "            nn.ReLU(),\n",
    "            nn.Conv2d(ch_out // 4, ch_out // 4, kernel_size=(3, 1), padding=(1, 0)),\n",
    "            nn.ReLU(),\n",
    "            nn.Conv2d(ch_out // 4, ch_out // 4, kernel_size=(1, 3), padding=(0, 1)),\n",
    "            nn.ReLU(),\n",
    "            nn.Conv2d(ch_out // 4, ch_out, kernel_size=1),\n",
    "        )\n",
    "    def forward(self, x):\n",
    "        return self.block(x)\n",
    "\n",
    "class LPRNet(nn.Module):\n",
    "    def __init__(self, class_num, dropout_rate):\n",
    "        super(LPRNet, self).__init__()\n",
    "        self.class_num = class_num\n",
    "        self.backbone = nn.Sequential(\n",
    "            nn.Conv2d(in_channels=3, out_channels=64, kernel_size=3, stride=1), # 0\n",
    "            nn.BatchNorm2d(num_features=64),\n",
    "            nn.ReLU(),  # 2\n",
    "            nn.MaxPool3d(kernel_size=(1, 3, 3), stride=(1, 1, 1)),\n",
    "            small_basic_block(ch_in=64, ch_out=128),    # *** 4 ***\n",
    "            nn.BatchNorm2d(num_features=128),\n",
    "            nn.ReLU(),  # 6\n",
    "            nn.MaxPool3d(kernel_size=(1, 3, 3), stride=(2, 1, 2)),\n",
    "            small_basic_block(ch_in=64, ch_out=256),   # 8\n",
    "            nn.BatchNorm2d(num_features=256),\n",
    "            nn.ReLU(),  # 10\n",
    "            small_basic_block(ch_in=256, ch_out=256),   # *** 11 ***\n",
    "            nn.BatchNorm2d(num_features=256),   # 12\n",
    "            nn.ReLU(), #13\n",
    "            nn.MaxPool3d(kernel_size=(1, 3, 3), stride=(4, 1, 2)),  # 14\n",
    "            nn.Dropout(dropout_rate),\n",
    "            nn.Conv2d(in_channels=64, out_channels=256, kernel_size=(1, 4), stride=1),  # 16\n",
    "            nn.BatchNorm2d(num_features=256),\n",
    "            nn.ReLU(),  # 18\n",
    "            nn.Dropout(dropout_rate),\n",
    "            nn.Conv2d(in_channels=256, out_channels=class_num, kernel_size=(13, 1), stride=1), # 20\n",
    "            nn.BatchNorm2d(num_features=class_num),\n",
    "            nn.ReLU(),  # *** 22 ***\n",
    "        )\n",
    "        self.container = nn.Sequential(\n",
    "            nn.Conv2d(in_channels=256+class_num+128+64, out_channels=self.class_num, kernel_size=(1,1), stride=(1,1)),\n",
    "            # nn.BatchNorm2d(num_features=self.class_num),\n",
    "            # nn.ReLU(),\n",
    "            # nn.Conv2d(in_channels=self.class_num, out_channels=self.lpr_max_len+1, kernel_size=3, stride=2),\n",
    "            # nn.ReLU(),\n",
    "        )\n",
    "\n",
    "    def forward(self, x):\n",
    "        keep_features = list()\n",
    "        for i, layer in enumerate(self.backbone.children()):\n",
    "            x = layer(x)\n",
    "            if i in [2, 6, 13, 22]: # [2, 4, 8, 11, 22]\n",
    "                print(\"intermediate feature map {} shape is: \".format(i), x.shape)\n",
    "                keep_features.append(x)\n",
    "\n",
    "        global_context = list()\n",
    "        for i, f in enumerate(keep_features):\n",
    "            if i in [0, 1]:\n",
    "                f = nn.AvgPool2d(kernel_size=5, stride=5)(f)\n",
    "            if i in [2]:\n",
    "                f = nn.AvgPool2d(kernel_size=(4, 10), stride=(4, 2))(f)\n",
    "            f_pow = torch.pow(f, 2)\n",
    "            f_mean = torch.mean(f_pow)\n",
    "            f = torch.div(f, f_mean)\n",
    "            print(\"after globel context {} shape is: \".format(i), f.shape)\n",
    "            global_context.append(f)\n",
    "\n",
    "        x = torch.cat(global_context, 1)\n",
    "        x = self.container(x)\n",
    "        print(\"after container shape is: \", x.shape)\n",
    "        logits = torch.mean(x, dim=2)\n",
    "\n",
    "        return logits\n",
    "    \n",
    "CHARS = ['京', '沪', '津', '渝', '冀', '晋', '蒙', '辽', '吉', '黑',\n",
    "     '苏', '浙', '皖', '闽', '赣', '鲁', '豫', '鄂', '湘', '粤',\n",
    "     '桂', '琼', '川', '贵', '云', '藏', '陕', '甘', '青', '宁',\n",
    "     '新',\n",
    "     '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',\n",
    "     'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K',\n",
    "     'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',\n",
    "     'W', 'X', 'Y', 'Z', 'I', 'O', '-'\n",
    "     ]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "intermediate feature map 2 shape is:  torch.Size([1, 64, 22, 92])\n",
      "intermediate feature map 6 shape is:  torch.Size([1, 128, 20, 90])\n",
      "intermediate feature map 13 shape is:  torch.Size([1, 256, 18, 44])\n",
      "intermediate feature map 22 shape is:  torch.Size([1, 68, 4, 18])\n",
      "after globel context 0 shape is:  torch.Size([1, 64, 4, 18])\n",
      "after globel context 1 shape is:  torch.Size([1, 128, 4, 18])\n",
      "after globel context 2 shape is:  torch.Size([1, 256, 4, 18])\n",
      "after globel context 3 shape is:  torch.Size([1, 68, 4, 18])\n",
      "after container shape is:  torch.Size([1, 68, 4, 18])\n",
      "output shape is:  torch.Size([1, 68, 18])\n"
     ]
    }
   ],
   "source": [
    "lprnet = LPRNet(class_num=len(CHARS), dropout_rate=0)\n",
    "lprnet.to(device)\n",
    "lprnet.load_state_dict(torch.load('LPRNet/weights/Final_LPRNet_model.pth', map_location=lambda storage, loc: storage))\n",
    "lprnet.eval()\n",
    "preds = lprnet(transfer)\n",
    "print(\"output shape is: \", preds.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Decoding \n",
    "\n",
    "Based on the output matrix of the LPRNet, we want to calcuate the most likely text. The decoding function will take the argmax for each character of 18 length from the CHARS. The duplicate charaters are removed. The pseudo character denoted as \"-\" is inserted at some positions to allow algorithm ouputing duplicated characters. It will be removied when docoding it. for example:\n",
    "\n",
    "* \"to\" -> \"---tttttooo\", or \"-t-o-\", or \"to\"\n",
    "* \"too\" -> \"---ttttto-o\", or \"-t-o-o\", or \"to-o\", but not \"too\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "label is ['皖AC915E']\n",
      "pred_labels is [[12 41 43 40 32 36 45]]\n"
     ]
    }
   ],
   "source": [
    "def decode(preds, CHARS):\n",
    "    # greedy decode\n",
    "    pred_labels = list()\n",
    "    labels = list()\n",
    "    for i in range(preds.shape[0]):\n",
    "        pred = preds[i, :, :]\n",
    "        pred_label = list()\n",
    "        for j in range(pred.shape[1]):\n",
    "            pred_label.append(np.argmax(pred[:, j], axis=0))\n",
    "        no_repeat_blank_label = list()\n",
    "        pre_c = pred_label[0]\n",
    "        for c in pred_label: # dropout repeate label and blank label\n",
    "            if (pre_c == c) or (c == len(CHARS) - 1):\n",
    "                if c == len(CHARS) - 1:\n",
    "                    pre_c = c\n",
    "                continue\n",
    "            no_repeat_blank_label.append(c)\n",
    "            pre_c = c\n",
    "        pred_labels.append(no_repeat_blank_label)\n",
    "        \n",
    "    for i, label in enumerate(pred_labels):\n",
    "        lb = \"\"\n",
    "        for i in label:\n",
    "            lb += CHARS[i]\n",
    "        labels.append(lb)\n",
    "    \n",
    "    return labels, np.array(pred_labels) \n",
    "\n",
    "preds = preds.cpu().detach().numpy()  # (1, 68, 18)\n",
    "labels, pred_labels = decode(preds, CHARS)\n",
    "print(\"label is\", labels)\n",
    "print(\"pred_labels is\", pred_labels)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## LPRNet Training \n",
    "\n",
    "Since the LPRNet output and the target character sequence lengths are of different length, the methold of CTC loss is applied. CTC loss is well-known approach for situations where input and output squences are misaligned and variable lengths. More detailed explanation about CTC loss can be found in [An Intuitive Explanation of Connectionist Temporal Classification](https://towardsdatascience.com/intuitively-understanding-connectionist-temporal-classification-3797e43a86c). \n",
    "\n",
    "Pytorch has in-build ctc_loss function. The function accepts \n",
    "\n",
    "1. logarithmized probabilities of the outputs - log_probs in form of (T,N,C) where C = number of characters in CHARS including blank; T = input length and N = batch_size\n",
    "\n",
    "2. targets: (N, S) or (sum(target_lengths)\n",
    "\n",
    "3. input_lengths: (N)\n",
    "\n",
    "4. raget_lengths: (N)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "intermediate feature map 2 shape is:  torch.Size([2, 64, 22, 92])\n",
      "intermediate feature map 6 shape is:  torch.Size([2, 128, 20, 90])\n",
      "intermediate feature map 13 shape is:  torch.Size([2, 256, 18, 44])\n",
      "intermediate feature map 22 shape is:  torch.Size([2, 68, 4, 18])\n",
      "after globel context 0 shape is:  torch.Size([2, 64, 4, 18])\n",
      "after globel context 1 shape is:  torch.Size([2, 128, 4, 18])\n",
      "after globel context 2 shape is:  torch.Size([2, 256, 4, 18])\n",
      "after globel context 3 shape is:  torch.Size([2, 68, 4, 18])\n",
      "after container shape is:  torch.Size([2, 68, 4, 18])\n",
      "loss is:  tensor(30.7238, grad_fn=<MeanBackward1>)\n"
     ]
    }
   ],
   "source": [
    "ctc_loss = nn.CTCLoss(blank=len(CHARS)-1, reduction='mean') # reduction: 'none' | 'mean' | 'sum'\n",
    "\n",
    "imgs = torch.randn(2,3,24,94)\n",
    "labels = torch.randint(1,68, (14,), dtype=torch.long)\n",
    "\n",
    "input_lengths = (18, 18)\n",
    "target_lengths = (7,7)\n",
    "\n",
    "transfer = STN(imgs)\n",
    "logits = lprnet(transfer)  # torch.Size([batch_size, CHARS length, output length ])\n",
    "log_probs = logits.permute(2, 0, 1) # for ctc loss: length of output x batch x length of chars\n",
    "log_probs = log_probs.log_softmax(2).requires_grad_()       \n",
    "loss = ctc_loss(log_probs, labels, input_lengths=input_lengths, target_lengths=target_lengths)\n",
    "\n",
    "print('loss is: ', loss)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
